wsdl : message에 여러 wsdl : part가있는 Wsdl2Apex 가져 오기

Aug 20 2020

멀티 파트 메시지가 포함 된 Salesforce에서 WSDL을 가져 오려고합니다.

멀티 파트 메시지는 wsdl2Apex 도구에서 지원되지 않습니다. 제안 된 해결 방법 은 WSDL을 수정하여 apex 클래스를 생성하고 요청-응답 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이 apex에서 어떻게 사용되는지 이해하고 싶습니다.

간단한 예가 큰 도움이 될 것입니다.

다음은 내가 embeddedAsync.init메소드를 수정 한 WSDL 및 생성 된 코드입니다 . 샘플 코드

답변

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