【问题标题】:SOAP message - Add authentication in http headerSOAP 消息 - 在 http 标头中添加身份验证
【发布时间】:2016-03-25 10:56:11
【问题描述】:

我必须向需要在 http 请求中进行基本身份验证的 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 中设置用户名和密码,但它会忽略它们,并且不会引发异常。 网络服务不断告诉我凭据丢失。

我设法在 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 一起使用。

【问题讨论】:

标签: delphi http soap firemonkey delphi-xe8


【解决方案1】:

好的,多亏了 cmets,我做到了。

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#中做的事情,但我之前想不通。

谢谢

【讨论】:

  • 对象 idEncoderMIME1 的数据类型是什么?这个对象是在哪里创建的?
  • 如何处理soap服务器端?
【解决方案2】:

在较新版本的 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 答案

【讨论】:

  • 如何处理soap服务器端?
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多