当响应代码为 300 或更高时,TRestRequest.Execute 退出线程

问题描述

我需要检查 RestResponse 中的特定状态代码,但是当状态代码不是 200 时,RestRequest.Execute 似乎会生成 EHTTPProtocolException

我确实查看了文档,它指出 The request execution does not raise HTTP protocol exceptions. To verify the response status,check the TCustomRESTResponse.StatusCode property.

我在理解 EHTTPProtocolException 为何被加注时遇到了一些麻烦。我该如何忽略或压制它?我确实检查过它是否只是调试器,但即使在发布版本和独立运行时,代码也会在执行时停止。

Exception Screenshot

我的代码如下:

procedure TdmWebsockets.GetRustMapURL(const Connection: TsgcWSConnection; const Data: string);
begin
  var jdata := TJSONObject.ParseJSONValue(Data);
  var restClient := TRESTClient.Create(Self);
  var restResponse := TRESTResponse.Create(Self);
  var restRequest := TRESTRequest.Create(Self);
  try
    var isStaging := jdata.GetValue<Boolean>('data.staging');
    var isBarren := jdata.GetValue<Boolean>('data.barren');
    var seed := jdata.GetValue<Int32>('data.seed');
    var size := jdata.GetValue<Int32>('data.size');

    restRequest.Client := restClient;
    restRequest.Response := restResponse;

    restClient.BaseURL := 'https://rustmaps.com/api/v2/maps/' + seed.ToString + '/' + size.ToString;

    restClient.RaiseExceptionOn500 := False;

    restRequest.AddParameter('staging',BoolToStr(isStaging,True));
    restRequest.AddParameter('barren',BoolToStr(isBarren,True));

    restRequest.Params.AddHeader('X-API-Key','REDACTED');

    restRequest.Method := TRESTRequestMethod.rmPOST;

    Writeln('before');
    restRequest.Execute;
    Writeln('after');

    var Writer: TJsonTextWriter;
    var StringWriter: TStringWriter;
    try
      StringWriter := TStringWriter.Create();
      Writer := TJsonTextWriter.Create(StringWriter);
      Writer.Formatting := TJsonFormatting.Indented;

      Writer.WriteStartObject;
      /////////////////////////////////////////////
      Writer.WritePropertyName('command');
      Writer.WriteValue(COMMAND_GETMAP);
      /////////////////////////////////////////////
      if restResponse.Status.SuccessOK_200 or restResponse.Status.ClientErrorDuplicate_409 then
      begin
        Writeln('200 ok');

        Writer.WritePropertyName('success');
        Writer.WriteValue(True);
      /////////////////////////////////////////////
        var mapID := restResponse.JSONValue.GetValue<string>('mapId');

        Writer.WritePropertyName('mapID');
        Writer.WriteValue(mapID);
      /////////////////////////////////////////////
      end
      else if restResponse.Status.ClientErrorBadRequest_400 then
      begin
        Writeln('400 ok');
      /////////////////////////////////////////////
        Writer.WritePropertyName('success');
        Writer.WriteValue(False);
      /////////////////////////////////////////////
        var reason := restResponse.JSONValue.GetValue<string>('reason');

        Writer.WritePropertyName('reason');
        Writer.WriteValue(reason);
      /////////////////////////////////////////////
      end;

      Writer.WriteEndObject;

      Writeln(StringWriter.ToString);

      Connection.WriteData(StringWriter.ToString);
    finally
      StringWriter.Free;
      Writer.Free;
    end;
  finally
    restRequest.Free;
    restResponse.Free;
    restClient.Free;
    jdata.Free;
  end;
end;

编辑: 单击异常窗口上的“中断”按钮时,它会将我带到 Execute 中的 Rest.HttpClient 方法,尽管它没有被添加到用途中。单步执行它表明它在 Rest.HttpClient 而不是 Rest.Client 中执行。

当我尝试使用 try .. except 时,我需要 Rest.HttpClient 来获取异常类型 EHTTPProtocolException。使用 try .. except 时它仍然抛出异常。我知道调试器仍然会捕获它,但代码永远不会在 try .. except 中运行,只是在异常发生后停止。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)