การนำเข้า Wsdl2Apex ด้วย wsdl หลายรายการ: เป็นส่วนหนึ่งในข้อความ wsdl:

Aug 20 2020

ฉันกำลังพยายามนำเข้า 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วิธีการ: โค้ดตัวอย่าง

คำตอบ

3 DanielBallinger Aug 21 2020 at 05:43

น่าเสียดายที่ฉันไม่คิดว่าคุณจะสามารถใช้ wsdl2apex และวิธีที่เกี่ยวข้องWebServiceCallout.invoke()กับการเรียกวิธีการหลายส่วนเหล่านี้

ดังที่คุณสังเกตเห็นinitข้อความประกอบด้วย 4 ส่วน:

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

แต่WebServiceCallout.invoke()จะยอมรับพารามิเตอร์คำขอเดียวเป็นอาร์กิวเมนต์ที่สองเท่านั้น

คุณอาจสามารถโปรโมตทั้งหมดยกเว้นส่วนใดส่วนหนึ่งในส่วนหัวตามการนำเข้า UPS Street Address WSDL ไปยัง Apexแต่จะขึ้นอยู่กับสิ่งที่บริการเว็บเป้าหมายคาดหวัง


มีความท้าทายสองสามประการกับWSDLนี้:

  1. schemaกำหนดtargetNamespaceแต่ละเว้นxmlnsแอตทริบิวต์
  2. มีองค์ประกอบหลายอย่างในสคีมาที่กำหนดเป็นประเภทที่ซับซ้อนซึ่งมีองค์ประกอบซ้อนที่กำหนดโดยประเภทที่ซับซ้อน เช่น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