Импорт 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 частей:
- идентификатор сессии
- taskId
- initContext
- callbackContext
Но WebServiceCallout.invoke()
будет принимать только один параметр запроса в качестве второго аргумента.
Возможно, вы сможете продвигать все части, кроме одной, в заголовки в соответствии с Импортированием WSDL адреса улицы UPS в 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