'解组错误:cvc-complex-type.2.4.a:发现无效的内容,从元素'XXXXX'开始。预期为“ {XXXXX}”之一

Delphi学习者

嗨,我正在通过WSDL将Java Web服务加载到Delphi7。当我从Delphi调用Web服务时,我遇到了以下错误。我被困在这里毫无头绪。

'解组错误:cvc-complex-type.2.4.a:发现无效的内容,从元素'XXXXX'开始。预期为“ {XXXXX}”之一

使用WSDL delphi会生成以下代码。我在下面的代码中删除了许多方法。

   // ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL     : http://localhost/protectappws/services/ProtectappwsImpl?wsdl
// Encoding : UTF-8
// Version  : 1.0
// (3/5/2016 5:55:17 AM - 1.33.2.5)
// ************************************************************************ //

unit ProtectappwsImpl;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Borland types; however, they could also 
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:string          - "http://www.w3.org/2001/XMLSchema"
  // !:boolean         - "http://www.w3.org/2001/XMLSchema"
  // !:int             - "http://www.w3.org/2001/XMLSchema"

  Encrypt              = class;                 { "http://dsws.org/protectappws/" }
  Decrypt              = class;                 { "http://dsws.org/protectappws/" }


   // ************************************************************************ //
  // Namespace : http://dsws.org/protectappws/
  // Serializtn: [xoLiteralParam]
  // ************************************************************************ //
  Encrypt = class(TRemotable)
  private
    Fusername: WideString;
    Fpassword: WideString;
    Fkeyname: WideString;
    Fkeyiv: WideString;
    Ftransformation: WideString;
    Fplaintext: WideString;
  public
    constructor Create; override;
  published
    property username: WideString read Fusername write Fusername;
    property password: WideString read Fpassword write Fpassword;
    property keyname: WideString read Fkeyname write Fkeyname;
    property keyiv: WideString read Fkeyiv write Fkeyiv;
    property transformation: WideString read Ftransformation write Ftransformation;
    property plaintext: WideString read Fplaintext write Fplaintext;
  end;

  EncryptResponse =  type WideString;      { "http://dsws.org/protectappws/"[L] }


  // ************************************************************************ //
  // Namespace : http://dsws.org/protectappws/
  // Serializtn: [xoLiteralParam]
  // ************************************************************************ //
  Decrypt = class(TRemotable)
  private
    Fusername: WideString;
    Fpassword: WideString;
    Fkeyname: WideString;
    Fkeyiv: WideString;
    Ftransformation: WideString;
    Fciphertext: WideString;
  public
    constructor Create; override;
  published
    property username: WideString read Fusername write Fusername;
    property password: WideString read Fpassword write Fpassword;
    property keyname: WideString read Fkeyname write Fkeyname;
    property keyiv: WideString read Fkeyiv write Fkeyiv;
    property transformation: WideString read Ftransformation write Ftransformation;
    property ciphertext: WideString read Fciphertext write Fciphertext;
  end;

  DecryptResponse =  type WideString;      { "http://dsws.org/protectappws/"[L] }


   // ************************************************************************ //
  // Namespace : http://dsws.org/protectappws/
  // soapAction: http://dsws.org/protectappws/%operationName%
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : document
  // binding   : protectappwsSOAP
  // service   : protectappws
  // port      : protectappwsSOAP
  // URL       : http://localhost/protectappws/services/ProtectappwsImpl
  // ************************************************************************ //
  protectappws = interface(IInvokable)
  ['{EAB73212-14C4-1A41-ABFA-F106C8EB9965}']
    function  Encrypt(const parameters: Encrypt): EncryptResponse; stdcall;
    function  Decrypt(const parameters: Decrypt): DecryptResponse; stdcall;
  end;

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


implementation

function Getprotectappws(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): protectappws;
const
  defWSDL = 'http://localhost/protectappws/services/ProtectappwsImpl?wsdl';
  defURL  = 'http://localhost/protectappws/services/ProtectappwsImpl';
  defSvc  = 'protectappws';
  defPrt  = 'protectappwsSOAP';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as protectappws);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;




constructor Encrypt.Create;
begin
  inherited Create;
  FSerializationOptions := [xoLiteralParam];
end;

constructor Decrypt.Create;
begin
  inherited Create;
  FSerializationOptions := [xoLiteralParam];
end;

initialization
  InvRegistry.RegisterInterface(TypeInfo(protectappws), 'http://dsws.org/protectappws/', 'UTF-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(protectappws), 'http://dsws.org/protectappws/%operationName%');
  InvRegistry.RegisterInvokeOptions(TypeInfo(protectappws), ioDocument);
  InvRegistry.RegisterInvokeOptions(TypeInfo(protectappws), ioLiteral);
  RemClassRegistry.RegisterXSInfo(TypeInfo(EncryptResponse), 'http://dsws.org/protectappws/', 'EncryptResponse');
  RemClassRegistry.RegisterXSInfo(TypeInfo(DecryptResponse), 'http://dsws.org/protectappws/', 'DecryptResponse');
  RemClassRegistry.RegisterXSClass(Encrypt, 'http://dsws.org/protectappws/', 'Encrypt');
  RemClassRegistry.RegisterSerializeOptions(Encrypt, [xoLiteralParam]);
  RemClassRegistry.RegisterXSClass(Decrypt, 'http://dsws.org/protectappws/', 'Decrypt');
  RemClassRegistry.RegisterSerializeOptions(Decrypt, [xoLiteralParam]);

end.

下面是我调用Web服务的Delphi 7代码。

unit Client;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,ProtectappwsImpl, StdCtrls, Buttons, InvokeRegistry, Rio,
  SOAPHTTPClient;

type
  TForm1 = class(TForm)
    memResponse: TMemo;
    memErrors: TMemo;
    btnProcess: TBitBtn;
    procedure btnProcessClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnProcessClick(Sender: TObject);
var
  ECrypt : Encrypt;
  objService : protectappws;
  wsResponse : WideString;


  ProtectApp : protectappws;
begin
  memResponse.Lines.Clear;
  memErrors.Lines.Clear;
  memResponse.Refresh;
  memErrors.Refresh;
  try
    ECrypt :=  Encrypt.Create;


    ECrypt.username := 'kenwhite';
    ECrypt.password := 'kenwhite';
    ECrypt.keyname := 'MYKEY';
    ECrypt.plaintext := 'Hi';


    objService := Getprotectappws(True,EmptyStr,nil);

    wsResponse :=  objService.Encrypt(ECrypt);


  except
    on E: Exception do
    begin
       showmessage(e.Message);
    end;
  end;
end;

end.

当我在delphi代码上运行时,我得到以下错误

'解组错误:cvc-complex-type.2.4.a:发现无效的内容,以元素'username'开头。预期为“ {username}”之一

Delphi正在将以下请求发送到Java Web服务

<?xml version="1.0"?>

-<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">


-<SOAP-ENV:Body>


-<Encrypt xmlns="http://dsws.org/protectappws/">

<username>kenwhite</username>

<password>kenwhite</password>

<keyname>MYKEY</keyname>

<keyiv/>

<transformation/>

<plaintext>Hi</plaintext>

</Encrypt>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

但Webservice预期低于要求。

<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:prot="http://dsws.org/protectappws/"><soapenv:Header/>
   <soapenv:Body>
         <prot:Encrypt><username>kenwhite</username>
         <password>kenwhite</password>
         <keyname>MYKEY</keyname>
         <!--Optional:-->
         <keyiv/>
         <!--Optional:-->
         <transformation/>
         <plaintext>Hi</plaintext>
      </prot:Encrypt>
   </soapenv:Body>
</soapenv:Envelope>

为什么在delphi生成的请求中存在差异,而客户端期望的是不同的请求。

我试图从下面的代码中删除ioDocument,并保持ioLiteral和虎钳

  InvRegistry.RegisterInvokeOptions(TypeInfo(protectappws), ioDocument);
  InvRegistry.RegisterInvokeOptions(TypeInfo(protectappws), ioLiteral);

Delphi 7正在使用SOAP-ENV生成soap请求,而Java正在使用soapenv。我真的很困惑,坚持下去。

Delphi学习者

为了解决这个问题,我修改了soap请求。

Delphi 7中存在一个错误,因此不允许我更改肥皂请求。为了解决这个问题,我从embarcadero下载了Soapfix,并更改了HTTPRIO组件的onbeforeExecute事件的soap请求,它开始工作。:)

在修改请求之前,我们只需要知道期望什么Web服务并更改请求即可。

从我的请求XML中,我刚刚从“加密”节点中删除了名称空间,并且该名称空间正在运行。

<Encrypt xmlns="http://dsws.org/protectappws/">

我修改的请求xml

<?xml version="1.0"?>

-<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">

-<SOAP-ENV:Body>

-<Encrypt>

<username>kenwhite</username>

<password>kenwhite</password>

<keyname>MYKEY</keyname>

<keyiv/>

<transformation/>

<plaintext>Hi</plaintext>

</Encrypt>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档