SOAP 消息 - 在 http header 中添加身份验证

SOAP message - Add authentication in http header

我必须在 http 请求中向需要基本身份验证的 WebService 发送 SOAP 消息,但我找不到执行此操作的方法。

搜索后我找到了一些解决方案和变通方法,但 none 有效。

这是我的代码:

procedure TMyForm.HTTPRIOHTTPWebNode1BeforePost(
 const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
 UserName: string;
 PassWord: string;
begin

UserName := 'aaa';
Password := 'bbb';

if not InternetSetOption(Data,
                  INTERNET_OPTION_USERNAME,
                  PChar(UserName),
                  Length(UserName)) then
 raise Exception(SysErrorMessage(GetLastError));

if not InternetSetOption(Data,
                  INTERNET_OPTION_PASSWORD,
                  PChar(Password),
                  Length(Password)) then
 raise Exception(SysErrorMessage(GetLastError));


end;

我尝试在 HTTPRIO.HTTPWebNode 中设置用户名和密码,但它会忽略它们,并且不会引发异常。 Web 服务一直告诉我缺少凭据。

我设法用 c# 做到了

protected override WebRequest GetWebRequest(Uri uri)
{

    HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri);
    Byte[] credentialBuffer = new UTF8Encoding().GetBytes("aaa:bbb");
    request.Headers.Add("Authorization", string.Format("Basic {0}", Convert.ToBase64String(credentialBuffer)));
    return request;

}

但我在 delphi 中找不到方法。

我是漏掉了什么还是做错了什么?

我使用 DelphiXE8 和 Firemonkey。

好的,感谢评论,我做到了。

procedure TMyForm.HTTPRIOHTTPWebNode1BeforePost(
 const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
 auth: String;
begin

  auth := 'Authorization: Basic ' + idEncoderMIME1.EncodeString('aaa:bbb' );
  HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);

end;

我只是在头部添加了'Authorization: Basic '+username:password编码。

其实我只是把我在c#里做的事情做了,之前想不通

谢谢

较新版本的 Delphi(10.3 Rio 之前)

procedure TClientSOAP.DoHTTPWebNodeBeforePost(
  const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
  auth: String;
begin
  auth := 'Authorization: Basic ' + TNetEncoding.Base64.Encode(FUserName + ':' + FPassword);
  HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);
end;

对于 10.3 Rio,即使您有代理,也必须使用 mjn42 答案

对于 HTTP 基本身份验证,此代码(放置在调用 SOAP 服务之前)应该有效:

HTTPRIO.HTTPWebNode.UserName := 'aaa';
HTTPRIO.HTTPWebNode.Password := 'bbb';

而不是 TMyForm.HTTPRIOHTTPWebNode1BeforePost 事件处理程序