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调试器上没有发生错误
因此,部分错误出现在我的代码上。。但是我没有发现重点
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;