Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 我对delphi中的TRestRequest有疑问_Http_Delphi - Fatal编程技术网

Http 我对delphi中的TRestRequest有疑问

Http 我对delphi中的TRestRequest有疑问,http,delphi,Http,Delphi,我有一个连接RestAPI服务器的代码。该代码由三个组件组成,分别是TRestCLient,TRestRequest,TRestResponse。我将尝试获取API响应。但是,一台服务器没有问题,但另一台服务器出现有关无效参数的错误。(enehttpexception,消息为:'error querying headers:(87)…)两台服务器上的RESTAPI服务相同。并且在delphiREST调试器上没有发生错误 因此,部分错误出现在我的代码上。。但是我没有发现重点 我试图设置Rest调试

我有一个连接
RestAPI
服务器的代码。该代码由三个组件组成,分别是
TRestCLient
TRestRequest
TRestResponse
。我将尝试获取API响应。但是,一台服务器没有问题,但另一台服务器出现有关无效参数的错误。(
enehttpexception,消息为:'error querying headers:(87)…
)两台服务器上的
RESTAPI
服务相同。并且在
delphi
REST调试器上没有发生错误

因此,部分错误出现在我的代码上。。但是我没有发现重点

  • 我试图设置Rest调试器组件。->这是失败的
  • 我通过调试跟踪了“
    System.Net.HttpClient.Win
    ”的“
    DoExecuteRequest
  • 异常类
    ENetHTTPException
    带有消息“错误查询头:(87)参数不正确”


    故障在我的程序中

    我需要承载密钥来发布RESTAPI。我的程序是在多线程环境下运行的。 我通过一个线程获得了密钥,并将密钥用于每个线程。这就是原因。 我更改了代码以从每个线程获取密钥


    就这些。我不知道为什么会发生这种错误。但我知道,其中一个响应标题的“Cookie”丢失了。

    IMHO,这个问题的标题太笼统了
    procedure TRestAPI.SetAPIInfo(EnabledKey, EnabledUnit: Boolean);
    var
      Param: pAPIParameter;
      i, iIndex: Integer;
    begin
      if (FMethodType = '') or (FResource = '') then
        Exit;
    
      FRRp.ResetToDefaults;
      FRRq.ResetToDefaults;
    
      FRRp.RootElement := '';
      FRRq.Params.CreateURLSegmentsFromString(FResource);
      FRRq.Method := RESTRequestMethodFromString(FMethodType);
      FRRq.Resource := FResource;
      FRRq.Params.Clear;
    
      if EnabledKey then
      begin
        FRRq.Params.AddItem;
        FRRq.Params[0].Name  := PARAM_KEY_AUTH;
        FRRq.Params[0].Value := PARAM_KEY_BEARER + ' ' + FUserKey;
        FRRq.Params[0].Kind  := pkHTTPHEADER;
        FRRq.Params[0].Options := FRRq.Params[0].Options + [poDoNotEncode];
      end;
    
      if EnabledUnit then
      begin
        FRRq.Params.AddItem;
        FRRq.Params[1].Name  := PARAM_KEY_UNIT_ID;
        FRRq.Params[1].Value := IntToStr(FUnitID);
        FRRq.Params[1].Kind  := pkHTTPHEADER;
        FRRq.Params[1].Options := FRRq.Params[1].Options + [poDoNotEncode];
      end;
    
      iIndex := FRRq.Params.Count;
      if FParamList.Count > 0 then
      begin
        for I := 0 to FParamList.Count-1 do
        begin
          Param := FParamList.Items[i];
          FRRq.Params.AddItem;
          FRRq.Params[iIndex + i].Name  := Param^.Name;
          FRRq.Params[iIndex + i].Value := Param^.Value;
          FRRq.Params[iIndex + i].Kind  := Param^.Kind;
          FRRq.Params[iIndex + i].Options := FRRq.Params[iIndex + i].Options + [poDoNotEncode];
        end;
      end;
    end;
    
    function TRestAPI.ExcuteAPI(EnabledKey, EnabledUnit, ArrayOfResult: Boolean;
      ArrayDSField: array of TDSFieldInfo): Boolean;
    begin
      Result := False;
      FErrCode := -1;
      FErrText := '';
      FRecordCount := -1;
      FAPIResponse := '';
    
      SetAPIInfo(EnabledKey, EnabledUnit);
      try
        FRRq.Execute;
      except
        on E:Exception do
        begin
          SetResultCodeText(999, 'Check the RestAPI.' + NL + e.Message);
          Exit;
        end;
      end;
    
      FAPIResponse := FRRp.Content;
      if (FRRp.StatusCode = 200) then
      begin
        if not SetDataSetField(ArrayDSField) then Exit;
        if not JsonToDataSet(ArrayOfResult, FRRp.Content, ArrayDSField) then
        begin
          ClearDataSetField;
          Exit;
        end;
        FCDS.First;
        FRecordCount := FCDS.RecordCount;
      end
      else if FRRp.StatusCode >= 300 then
      begin
        SetResultCodeText(FRRp.StatusCode, FRRp.StatusText + NL + FRRp.Content);
        Exit;
      end;
    
      Result := True;
    end;