Mengimpor Wsdl2Apex dengan beberapa wsdl: bagian dalam pesan wsdl :.

Aug 20 2020

Saya mencoba mengimpor WSDL di tenaga penjualan yang berisi pesan Multi-bagian.

Pesan multi-bagian tidak didukung oleh alat wsdl2Apex. The menyarankan solusi adalah untuk memodifikasi WSDL untuk menghasilkan kelas puncak dan menjaga struktur permintaan-respon XML yang sama.

Saya mencoba memulai dengan embeddedAsync.initmetode di mana saya menambahkan kelas ekstra untuk membungkus semua pesan bagian. Namun, pemanggilan gagal dengan pengecualian

System.CalloutException: Web service callout failed: WebService returned a SOAP Fault: Unexpected element {http://webservice.embedded.server.qa.encoway.com/}init found. Expected {http://webservice.embedded.server.qa.encoway.com/}WebserviceSessionId. faultcode=soap:Client faultactor=

Saya baru mengenal dunia SOAP API dan ingin memahami bagaimana WSDL multipart dikonsumsi di puncak.

Contoh sederhana akan sangat membantu.

Berikut adalah WSDL dan kode yang dihasilkan di mana saya memodifikasi embeddedAsync.initmetode: Kode Sampel

Jawaban

3 DanielBallinger Aug 21 2020 at 05:43

Sayangnya saya tidak berpikir Anda akan dapat menggunakan wsdl2apex dan yang sesuai WebServiceCallout.invoke()untuk memanggil metode multi bagian ini.

Seperti yang Anda amati, initpesan tersebut terdiri dari 4 bagian:

  1. sessionId
  2. taskId
  3. initContext
  4. callbackContext

Tetapi WebServiceCallout.invoke()hanya akan menerima satu parameter permintaan sebagai argumen kedua.

Anda mungkin dapat mempromosikan semua kecuali satu bagian ke header sesuai dengan Mengimpor Alamat Jalan UPS WSDL ke Apex , tetapi itu akan tergantung pada apa yang diharapkan layanan web target.


Ada beberapa tantangan dengan WSDL ini :

  1. The schemamendefinisikan targetNamespace, tetapi mengabaikan yang xmlnsatribut.
  2. Ada beberapa elemen dalam skema yang didefinisikan sebagai tipe kompleks yang memiliki elemen bertingkat yang juga ditentukan oleh tipe kompleks. Mis AsyncActivateResult > activateResult.

(1) mudah diselesaikan dengan menambahkan xmlnsatribut pada skema agar cocok dengan targetNamespace.

<xs:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://webservice.embedded.server.qa.backend.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" attributeFormDefault="unqualified" elementFormDefault="unqualified" 
            targetNamespace="http://webservice.embedded.server.qa.backend.com/" 
            xmlns="http://webservice.embedded.server.qa.backend.com/" 
            version="1.0">

(2) diselesaikan dengan mengekstrak elemen complexType bersarang yang mempromosikannya ke turunan langsung skema. Kemudian, elemen menggunakan tipe yang dihasilkan sebagai referensi daripada mencoba menumpuk complexType.

<!-- Created this complex type from the content of activateResult -->
<xs:complexType name="activateResultType">
    <xs:complexContent>
        <xs:extension base="tns:SaveResultType">
            <xs:sequence>
                <xs:element minOccurs="0" name="printedDocument" type="tns:ActivationAttachment"/>
                <xs:element minOccurs="0" name="exportFormat" type="tns:ActivationAttachment"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:element name="AsyncActivateResult">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="phase" type="xs:int"/>
            <xs:element minOccurs="0" name="activateResult" type="activateResultType">
                <!--<xs:complexType> has been un-nested -->
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Kelas Apex yang dihasilkan - webserviceEmbeddedServerQaBackendCo.cls