Mengimpor Wsdl2Apex dengan beberapa wsdl: bagian dalam pesan wsdl :.
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.init
metode 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.init
metode: Kode Sampel
Jawaban
Sayangnya saya tidak berpikir Anda akan dapat menggunakan wsdl2apex dan yang sesuai WebServiceCallout.invoke()
untuk memanggil metode multi bagian ini.
Seperti yang Anda amati, init
pesan tersebut terdiri dari 4 bagian:
- sessionId
- taskId
- initContext
- 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 :
- The
schema
mendefinisikantargetNamespace
, tetapi mengabaikan yangxmlns
atribut. - 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 xmlns
atribut 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