web-services - 在 WSDL 上执行基本身份验证
问题描述
我需要与 WSDL 网络服务器交互,这是我第一次使用这种技术,通常我不处理网络编程。从来没有这样做过,我在使用网络上可用的一些 WSDL 之前做了一些测试并且它有效,但现在我发现自己完全被阻止了,因为我必须连接的 WSDL 需要“基本”身份验证,只需“用户名”和“密码”。我在网上阅读了很多帖子,但所看到的都没有解决问题。我在Delphi Rio 10.3 版本,我看到我使用的Rio 版本之前和之后的身份验证存在差异。与创建接口单元相关的部分可以正常工作,但我无法使用创建的接口,因为我总是收到身份验证错误 401。
ZWS_TEST02 = interface(IInvokable)
['{C6FABE09-74A8-3DE6-906F-B1D33E6F4B09}']
function ZWS_TEST02(const I_PAR01: char255): char255; stdcall;
end;
function GetZWS_TEST02(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): ZWS_TEST02;
const
defWSDL = '--MY LINK--------?wsdl';
defSvc = 'ZWS_TEST02';
defPrt = 'BND_TEST02';
var
RIO: THTTPRIO;
begin
Result := nil;
if (Addr = '') then
begin
Addr := defWSDL
end;
if HTTPRIO = nil then begin
RIO := THTTPRIO.Create(nil);
end else begin
RIO := HTTPRIO;
end;
try
Result := (RIO as ZWS_TEST02);
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
RIO.HTTPWebNode.UseDefaultCredentials:=true;
RIO.HTTPWebNode.UserName:='User';
RIO.HTTPWebNode.Password:='Password';
finally
if (Result = nil) and (HTTPRIO = nil) then
RIO.Free;
end;
end;
实际上,当我没有插入设置用户和密码的两行代码时,会出现 401 错误,而当我启用这两行代码时,我收到错误 12007“无法解析服务器名称或地址”!?
在阅读了旧版本的 Delphi 之后,您必须改用 OnBeforePost 事件,我尝试在西雅图使用它,但没有成功。实际上,分配的事件是这样的:
procedure TForm1.BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
UserName: string;
PassWord: string;
auth:string;
begin
UserName := 'User';
Password := 'Password';
auth := 'Authorization: Basic ' + TNetEncoding.Base64.Encode(UserName + ':' + Password);
HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);
end;
谁能告诉我哪里错了,或者我该如何解决这个身份验证问题?
解决方案
推荐阅读
- r - 基于另一个数据集创建分层样本
- swift - Vapor 4:子关系未急切加载,使用 $ 前缀访问
- angular - 如何使用 HttpClient 以角度将内容发送到 GET 请求的 req.body 中?
- php - 从数据库查询多行,但在gridview中只在一行上获取它们
- c++ - Direct3D 11 访问被拒绝
- liferay - Liferay 7.2 渲染带有实例的 portlet 的 url
- python - 向 Conv2D 层添加 padding='same' 参数破坏了模型
- function - 使用 .mcfunction 文件时如何进行延迟?关闭
- movesense - Movesense 删除单个数据记录器条目
- sql - PostgreSQL | 需要来自右表的值,其中 m:n 索引中不匹配