wsdl : message에 여러 wsdl : part가있는 Wsdl2Apex 가져 오기
멀티 파트 메시지가 포함 된 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 및 생성 된 코드입니다 . 샘플 코드
답변
불행히도 나는 당신이 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