Как вы узнали, THTTPReqResp
перенес операцию дробовика в Delphi 10.3. Первоначально он использовал Win INet на Windows и Indy на Linux под капотом, но они изменили его на THTTPClient
(для поддержки мобильных платформ, я думаю).
В этой новой реализации ни один из THTTPReqResp
методов (Get
, Execute
) и событий (OnBeforePost
, OnReceivingData
) не выставляет Request
или Response
объекты.
Однако, есть шанс получить доступ к объекту Response
через глобальный обработчик OnHttpError
, если сервер ответит ошибочным кодом состояния HTTP (> = 300). Используйте процедуру Soap.SOAPHTTPTrans.SetOnHttpError
для установки глобального обработчика. Он имеет HTTPResponse: IHTTPResponse
в качестве второго параметра, который позволяет вам проверять возвращаемые заголовки. Если сервер отвечает статусом 1xx или 2xx, то вам не повезло, и вам следует рассмотреть возможность реализации пользовательского потомка THTTPReqResp
или перехода на более подходящую реализацию HTTP-клиента (например, THTTPClient
напрямую или подобное).
{ assuming HTTPReqResp1: THTTPReqResp is a component on TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
SetOnHttpError(HTTPReqRespError);
end;
procedure TForm1.HTTPReqRespError(const HTTPReqResp: THTTPReqResp;
const HTTPResponse: IHTTPResponse; const Error: ESOAPHTTPException;
var Action: TSOAPHttpErrorAction);
begin
if (HTTPReqResp = HTTPReqResp1) and StartsText('2000002', HTTPResponse.HeaderValue['x-ms-diagnostics']) then
begin
FTokenExpired := True;
Action := TSOAPHttpErrorAction.heaAbort; { or whatever }
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FTokenExpired := False;
try
{ ... }
{ HTTPReqResp1.Get or HTTPReqResp1.Execute or whatever }
{ ... }
except
if not FTokenExpired then
raise;
{ handle token expiration here }
end;
end;
По моему личному мнению, это довольно уродливый способ обработки таких случаев, и я просто не могу понять, почему они ввели глобальный обработчик в новый код, который затрагивает все экземпляры THTTPReqResp
. Я совсем не впечатлен этим новым дизайном.
Eagle eye : Вы заметили несоответствие регистра символов между THTTPReqResp
(THTTPClient
, ESOAPHTTPException
) и SetOnHttpError
(TSOAPHttpErrorEvent
, TSOAPHttpErrorAction
)?