Я импортировал 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>