delphi SOAP消息-在http标头中添加身份验证

sz81bmfz  于 2023-06-29  发布在  其他
关注(0)|答案(3)|浏览(167)

我必须在HTTP请求中向需要BASIC身份验证的WebService发送SOAP消息,但我找不到方法来完成。
经过搜索,我找到了一些解决方案和变通方法,但没有一个奏效。
下面是我的代码:

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中设置用户名和密码,但它忽略了它们,并且它没有出现异常。
WebService一直告诉我缺少凭据。
我用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 找不到方法。
是我漏了什么还是我做错了
Delphi XE8与FireMonkey

9udxz4iz

9udxz4iz1#

好吧,我感谢评论。

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;

我只是添加到标题'授权:基本' +用户名:密码编码。
实际上我只是做了我在c#中做的事情,但我以前无法弄清楚。
谢谢

g9icjywg

g9icjywg2#

在较新版本的 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里约你必须使用mjn42答案,即使你有代理

scyqe7ek

scyqe7ek3#

对于HTTP基本身份验证,以下代码(放置在调用SOAP服务之前)应该可以工作:

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

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

相关问题