我必须将SOAP消息发送到需要在http请求中进行基本身份验证的Web服务,但我找不到办法。
搜索后,我找到了一些解决方案和解决方法,但没有一个有效。
这是我的代码:
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;
}
但我找不到在德尔福做的方法。
我错过了什么或者我做错了吗?
我使用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;
我只是添加标题'授权:基本'+用户名:密码编码。
实际上我只是做了我在c#中所做的事情,但我以前无法理解。
谢谢
对于HTTP基本身份验证,此代码(在调用SOAP服务之前放置)应该有效:
HTTPRIO.HTTPWebNode.UserName := 'aaa';
HTTPRIO.HTTPWebNode.Password := 'bbb';
而不是TMyForm.HTTPRIOHTTPWebNode1BeforePost
事件处理程序
在较新版本的德尔福(在里约10.3之前)
procedure TLCInterfClientSOAP.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答案,即使你有代理