使用 Delphi 应用程序客户端、身份验证基础查询 WSDL-SOAP

Query WSDL-SOAP with Delphi app client, autentication Base

通过delphi我正在做一个客户端与ws通信。

WSDL:

  visualizzaErogatoPT = interface(IInvokable)
  ['{AD9DB9DE-E3E4-1FD0-171D-FD78913E0E54}']
    function  visualizzaErogato(const VisualizzaErogatoRichiesta: VisualizzaErogatoRichiesta): VisualizzaErogatoRicevuta; stdcall;
  end;

function GetvisualizzaErogatoPT(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): visualizzaErogatoPT;

  VisualizzaErogatoRichiesta = class(TRemotable)
  private
    FpinCode: stringType;
    FcodiceRegioneErogatore: stringType;
    FcodiceAslErogatore: stringType;
    FcodiceSsaErogatore: stringType;
    Fpwd: pwdType;
    Fnre: nreType;
    FcfAssistito: stringType;
    FcfAssistito_Specified: boolean;
    FtipoOperazione: tipoOperazioneType;
    procedure SetcfAssistito(Index: Integer; const AstringType: stringType);
    function  cfAssistito_Specified(Index: Integer): boolean;
  public
    constructor Create; override;
  published
    property pinCode:                stringType          read FpinCode write FpinCode;
    property codiceRegioneErogatore: stringType          read FcodiceRegioneErogatore write FcodiceRegioneErogatore;
    property codiceAslErogatore:     stringType          read FcodiceAslErogatore write FcodiceAslErogatore;
    property codiceSsaErogatore:     stringType          read FcodiceSsaErogatore write FcodiceSsaErogatore;
    property pwd:                    pwdType             read Fpwd write Fpwd;
    property nre:                    nreType             read Fnre write Fnre;
    property cfAssistito:            stringType          Index (IS_OPTN) read FcfAssistito write SetcfAssistito stored cfAssistito_Specified;
    property tipoOperazione:         tipoOperazioneType  read FtipoOperazione write FtipoOperazione;
  end;

procedure TMainF.Button2Click(Sender: TObject);
var
  richiesta: VisualizzaErogatoRichiesta;
  ricevuta: VisualizzaErogatoRicevuta;
begin
  richiesta.codiceRegioneErogatore := '190';
  richiesta.codiceAslErogatore := '201';
  richiesta.codiceSsaErogatore := '888888';
  richiesta.pwd := '';
  richiesta.nre := '1900A4005026299';
  richiesta.tipoOperazione := '1';
  try
    ricevuta :=  (HTTPRIO1 as visualizzaErogatoPT).visualizzaErogato(richiesta); 
    label1.Caption := ricevuta.nre;
  except
    on E: Exception do
      showmessage(E.Message);
  end;
end;

我收到一个错误。(EsoapDomConvertError .... Soap 类 必须来自 Tremotable 的设备)


我使用组件进行身份验证: HTTPRIO 和 HTTPReqResp

procedure TMainF.HTTPReqResp1BeforePost(const HTTPReqResp: THTTPReqResp;
  Data: Pointer);
var
  auth: String;
  FUserName, FPassword : string;
begin
  FUserName:='XXXXXXXX';
  FPassword:='XXXXXXXX';
  auth := 'Authorization: Basic ' + TNetEncoding.Base64.Encode(FUserName + ':' + FPassword);
  HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);
end;

我不知道如何让这些组件工作。

我试过各种方法都没有结果。 我是否必须使用 WS 所需的 "basic" 身份验证组件(HTTPRIO 和 HTTPReqResp)? 我正在寻找构建它的指南。

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

HTTPRio1.HTTPWebNode.UserName := 'XXXXXXXX';
HTTPRio1.HTTPWebNode.Password := 'XXXXXXXX';

而不是事件处理程序TMainF.HTTPReqResp1BeforePost