THTTPRio授权Bearer

后端开发 2026-07-10

我正在使用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章