我在delphi中有关于TRestRequest的问题

时间:2019-06-03 06:51:59

标签: http delphi

我有一个用于连接RestAPI服务器的代码。这段代码由TRestCLientTRestRequestTRestResponse 3个组成部分组成。我将尝试获取API响应。但是,一台服务器没有问题,但另一台服务器发生有关无效参数的错误。(ENetHTtpException with message: 'Error querying headers: (87)...)两台服务器上的RESTAPI服务相同。并且在delphi REST调试器上未发生该错误...

结果是我的代码中出现了部分错误。.但是我找不到要点。

  1. 我尝试设置为Rest Debugger组件。 ->失败。
  2. 我通过调试跟踪了“ DoExecuteRequest”中的“ System.Net.HttpClient.Win”。
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;
  

异常类ENetHTTPException,显示消息“查询标题错误:(87)参数不正确。

1 个答案:

答案 0 :(得分:0)

故障出在我的程序中。

我需要承载键来发布REST API。而且我的程序在多线程环境中。 我通过一个线程获得了密钥,并为每个线程使用了密钥。这就是原因。 我更改了代码以从每个线程获取密钥。

仅此而已。我不知道为什么会发生此错误。但是我知道响应标头之一的“ Cookie”丢失了。