การนำเข้า Wsdl2Apex ด้วย wsdl หลายรายการ: เป็นส่วนหนึ่งในข้อความ wsdl:
ฉันกำลังพยายามนำเข้า WSDL ใน Salesforce ซึ่งมีข้อความหลายส่วน
เครื่องมือ wsdl2Apex ไม่รองรับข้อความหลายส่วน วิธีแก้ปัญหาที่แนะนำคือการแก้ไข WSDL เพื่อสร้างคลาสเอเพ็กซ์และทำให้โครงสร้าง XML ตอบสนองการร้องขอเหมือนเดิม
ฉันลองเริ่มต้นด้วยembeddedAsync.init
วิธีการที่ฉันเพิ่มคลาสพิเศษเพื่อตัดข้อความส่วนทั้งหมด อย่างไรก็ตามคำขอราคาเสนอล้มเหลวโดยมีข้อยกเว้น
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=
ฉันยังใหม่กับโลก SOAP API และต้องการทำความเข้าใจว่า WSDL แบบหลายส่วนถูกใช้งานอย่างไรในช่วงปลาย
ตัวอย่างง่ายๆจะช่วยได้มาก
นี่คือ WSDL และโค้ดที่สร้างขึ้นซึ่งฉันแก้ไขembeddedAsync.init
วิธีการ: โค้ดตัวอย่าง
คำตอบ
น่าเสียดายที่ฉันไม่คิดว่าคุณจะสามารถใช้ wsdl2apex และวิธีที่เกี่ยวข้องWebServiceCallout.invoke()
กับการเรียกวิธีการหลายส่วนเหล่านี้
ดังที่คุณสังเกตเห็นinit
ข้อความประกอบด้วย 4 ส่วน:
- sessionId
- taskId
- initContext
- callbackContext
แต่WebServiceCallout.invoke()
จะยอมรับพารามิเตอร์คำขอเดียวเป็นอาร์กิวเมนต์ที่สองเท่านั้น
คุณอาจสามารถโปรโมตทั้งหมดยกเว้นส่วนใดส่วนหนึ่งในส่วนหัวตามการนำเข้า UPS Street Address WSDL ไปยัง Apexแต่จะขึ้นอยู่กับสิ่งที่บริการเว็บเป้าหมายคาดหวัง
มีความท้าทายสองสามประการกับWSDLนี้:
schema
กำหนดtargetNamespace
แต่ละเว้นxmlns
แอตทริบิวต์- มีองค์ประกอบหลายอย่างในสคีมาที่กำหนดเป็นประเภทที่ซับซ้อนซึ่งมีองค์ประกอบซ้อนที่กำหนดโดยประเภทที่ซับซ้อน เช่น
AsyncActivateResult > activateResult
.
(1) แก้ไขได้อย่างง่ายดายโดยการเพิ่มxmlns
แอตทริบิวต์บนสคีมาเพื่อให้ตรงกับ 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) ได้รับการแก้ไขโดยการแยกองค์ประกอบ complexType ที่ซ้อนกันกำลังส่งเสริมให้พวกเขากำหนดลูกหลานของสคีมาโดยตรง จากนั้นองค์ประกอบใช้ชนิดผลลัพธ์เป็นข้อมูลอ้างอิงแทนที่จะพยายามซ้อน 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>
คลาส Apex ที่เป็นผลลัพธ์ - webserviceEmbeddedServerQaBackendCo.cls