首页 > 解决方案 > 在 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;

谁能告诉我哪里错了,或者我该如何解决这个身份验证问题?

标签: web-servicesauthenticationdelphi

解决方案


推荐阅读