THTTPRio授权Bearer
我正在使用Delphi Tokio 10.2.3,并使用THTTPRIO组件来调用一个SOAP Web服务。
由于该服务已将认证从基础认证(用户名/密码)改为Bearer令牌认证,我需要在请求中使用Bearer令牌认证。
我该如何使用THTTPRIO在请求头中设置/添加令牌?
解决方案
你可以使用 THTTPRIO.HTTPWebNode.OnBeforePost 事件来自定义 THTTPRIO 的HTTP请求。
在10.2及更早版本中,事件的 Data 参数是一个原始的 Pointer。默认情况下,THTTPRIO 使用WinInet API,在这种情况下,Data 将是一个WinInet HINTERNET 请求句柄,你可以将其传递给任何WinInet请求函数,例如 HttpAddRequestHeaders(),例如:
uses
..., Winapi.WinInet;
procedure TMyForm.HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp;
Data: Pointer);
var
Token: string;
AuthHdr: string;
begin
Token := ...;
AuthHdr := 'Authorization: Bearer ' + Token + #13#10;
HttpAddRequestHeaders(Data, PChar(AuthHdr), Length(AuthHdr), HTTP_ADDREQ_FLAG_ADD);
end;
还有一种选项可以让 THTTPRIO 使用Indy代替WinInet(通过在定义 USE_INDY 的情况下重新编译 Soap.SOAPHTTPTrans 单元),在这种情况下,事件的 Data 参数将是指向一个Indy TIdHTTP 对象的指针,你可以使用它的 Request.CustomHeaders 属性,例如:
uses
..., IdHTTP;
procedure TMyForm.HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp;
Data: Pointer);
var
Token: string;
begin
Token := ...;
with TIdHTTP(Data).Request do
begin
BasicAuthentication := False; // <- important to set when using custom authentication...
CustomHeaders.Values['Authorization'] := 'Bearer ' + Token;
end;
end;
也就是说,在10.3及更高版本中,THTTPRIO 将专门使用Embarcadero自家的HTTP框架,因此 Data 参数已被替换为 THTTPClient 参数,该参数具有自己独立的 CustomHeaders 属性,例如:
procedure TMyForm.HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp;
Client: THTTPClient);
var
Token: string
begin
Token := ...;
Client.CustomHeaders['Authorization'] := 'Bearer ' + Token;
end;
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。