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

时间:2015-12-18 17:07:48

标签: delphi http soap firemonkey delphi-xe8

我必须向需要在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一起使用。

3 个答案:

答案 0 :(得分:1)

好的,我感谢评论。

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

由于

答案 1 :(得分:0)

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

let breakLoop = false
for (let answer of arr) {
  if (breakLoop) continue
  compare(answer.password, user.password)
    .then(match => {
      if (match) breakLoop = true
    })
    .catch(err => breakLoop = true)
}

在Rio 10.3中,即使您具有代理服务器,也必须使用mjn42答案

答案 2 :(得分:0)

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

EmpID | Year | Rank
 007  | 1962 |  1 
 007  | 1963 |  2
 007  | 1965 |  4
 007  | 1964 |  3
 007  | 1967 |  6
 007  | 1969 |  8
 007  | 1967 |  6

代替# what I have dict1 = {"A":[1,2,3], "B":[4,5,6], "C":[7,8,9]} # what I want dict2 = {1:"A", 2:"A", 3:"A", 4:"B", 5:"B", 6:"B", 7:"C", 8:"C", 9:"C"} 事件处理程序