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
事件处理程序
我必须在 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
事件处理程序