Как вставить значение в запрос SOAP, использующий схему xsd в Delphi? - PullRequest
0 голосов
/ 10 января 2019

Я импортировал WSDL из файла и его схему .xsd в Delphi. В этом случае я не знаю, как я могу вставить значение в запрос, потому что класс TRemotable не имеет ни частного, ни опубликованного объявления, просто имеет конструктор Create. WSDL использует схему .xsd. Когда я выполняю свою программу, она подключается к серверу, и мне нужно подтвердить сертификат (это нормально), но после этого я получаю сообщение об ошибке: «Входные данные не соответствуют определению схемы XML». Я думаю, потому что запрос отправляется без ввода строки. (Я попытался в SoapUI для отправки без входной строки и получил тот же ответ). Не могли бы вы объяснить, как я могу вставить значения в запрос, используя схему?

Я попробовал, как WSDL работает в SoapUI, и он работает нормально, это простой метод для тестирования сервера. Я пишу строку для ввода, и сервер отправляет обратно в ответ ту же строку, если она работает.

Часть импортированного WSDL:

  // ************************************************************************ //
  // XML       : SupportPingRequest, global, <element>
  // Namespace : urn:wsdltypes.nmvs.eu:v2.0
  // Serializtn: [xoLiteralParam]
  // Info      : Wrapper
  // ************************************************************************ //
  SupportPingRequest = class(TRemotable)
  private
  public
    constructor Create; override;
  published
  end;


  // ************************************************************************ //
  // XML       : SupportPingResponse, global, <element>
  // Namespace : urn:wsdltypes.nmvs.eu:v2.0
  // Serializtn: [xoLiteralParam]
  // Info      : Wrapper
  // ************************************************************************ //
  SupportPingResponse = class(TRemotable)
  private
  public
    constructor Create; override;
  published
  end;



  // ************************************************************************ //
  // Namespace : urn:services.nmvs.eu:v2.0
  // soapAction: |urn:PingSupport|urn:G445ChangePassword|urn:G482LoadTC|urn:G483ConfirmTC
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : document
  // use       : literal
  // binding   : WSHttpBinding_ISupportServices
  // service   : SupportServices
  // port      : Port_SupportServices
  // URL       : http://localhost:8080/WS_SUPPORT_V1/SupportServiceV10
  // ************************************************************************ //
  ISupportServices = interface(IInvokable)
  ['{A99C22A3-2FE1-EF7A-C0D6-2881F888FE1C}']

    // Cannot unwrap: 
    //     - Input element wrapper name does not match operation's name
    function  PingSupport(const messageParameters: SupportPingRequest): SupportPingResponse; stdcall;

  end;

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

Мой код:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  WS_PKI, WS_SUPPORT;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Service: ISupportServices;
  req: SupportPingRequest;
  res: SupportPingResponse;

begin
  req:= SupportPingRequest.Create;

  try
    GetISupportServices.PingSupport(req);
  finally
    req.Free;
  end;

end;

end.

== EDIT ==

Запрос SoapUI: (Я хотел бы вставить urn1: входное значение в Delphi)

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:wsdltypes.nmvs.eu:v2.0" xmlns:urn1="urn:types.nmvs.eu:v2.0">
   <soap:Header/>
   <soap:Body>
      <urn:SupportPingRequest>
         <urn1:Input>test string</urn1:Input>
      </urn:SupportPingRequest>
   </soap:Body>
</soap:Envelope>

Ответ SoapUI:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
   <soap:Body>
      <ns2:SupportPingResponse xmlns:ns1="urn:types.nmvs.eu:v2.0" xmlns:ns2="urn:wsdltypes.nmvs.eu:v2.0">
         <ns1:Output>test string</ns1:Output>
      </ns2:SupportPingResponse>
   </soap:Body>
</soap:Envelope>

1 Ответ

0 голосов
/ 10 января 2019

Наконец-то возникла проблема с Delphi 10.2.3, который неправильно импортировал файл WSDL, и половина классов отсутствовала. Я обновился до 10.3 и правильно импортировал файл.

...