2016-03-05 40 views
3

您好,我正在通過WSDL加載到Delphi 7的java webservice。當我打電話從德爾福的Web服務我越來越低的錯誤。我困在這裏沒有任何線索。'解組錯誤:cvc-complex-type.2.4.a:找到以元素'XXXXX'開頭的無效內容。其中一個'{XXXXX}'預計

'Unmarshalling Error: cvc-complex-type.2.4.a: Invalid content was found starting with element 'XXXXX'. One of '{XXXXX}' is expected

使用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. 

下面是我的Delphi 7代碼來調用web服務。

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代碼我收到以下錯誤

'Unmarshalling Error: cvc-complex-type.2.4.a: Invalid content was found starting with element 'username'. One of '{username}' is expected

德爾福發送低於請求的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> 

但web服務期待下面的請求。

<?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。 我真的很困惑,並堅持這一點。

+0

謝謝!很有幫助。 –

回答

2

要解決此問題,我修改了soap請求。

德爾福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> 
相關問題