我有一个用于连接RestAPI
服务器的代码。这段代码由TRestCLient
,TRestRequest
,TRestResponse
3个组成部分组成。我将尝试获取API响应。但是,一台服务器没有问题,但另一台服务器发生有关无效参数的错误。(ENetHTtpException with message: 'Error querying headers: (87)...
)两台服务器上的RESTAPI
服务相同。并且在delphi
REST调试器上未发生该错误...
结果是我的代码中出现了部分错误。.但是我找不到要点。
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)参数不正确。
答案 0 :(得分:0)
故障出在我的程序中。
我需要承载键来发布REST API。而且我的程序在多线程环境中。 我通过一个线程获得了密钥,并为每个线程使用了密钥。这就是原因。 我更改了代码以从每个线程获取密钥。
仅此而已。我不知道为什么会发生此错误。但是我知道响应标头之一的“ Cookie”丢失了。