Импорт 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. идентификатор сессии
  2. taskId
  3. initContext
  4. callbackContext

Но WebServiceCallout.invoke()будет принимать только один параметр запроса в качестве второго аргумента.

Возможно, вы сможете продвигать все части, кроме одной, в заголовки в соответствии с Импортированием WSDL адреса улицы UPS в 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