Importazione di Wsdl2Apex con più wsdl: part in un wsdl: message
Sto cercando di importare un WSDL in salesforce che contiene messaggi in più parti.
I messaggi in più parti non sono supportati dallo strumento wsdl2Apex. La soluzione alternativa suggerita è modificare il WSDL per generare una classe Apex e mantenere la stessa struttura XML di richiesta-risposta.
Ho provato a iniziare con il embeddedAsync.init
metodo in cui ho aggiunto una classe extra per racchiudere tutti i messaggi delle parti. tuttavia, il callout non riesce con un'eccezione
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=
Sono nuovo nel mondo delle API SOAP e vorrei capire come viene consumato il WSDL multiparte in apex.
Un semplice esempio sarebbe di grande aiuto.
Ecco il WSDL e il codice generato in cui ho modificato il embeddedAsync.init
metodo: Codice di esempio
Risposte
Sfortunatamente non penso che sarai in grado di usare wsdl2apex e il corrispondente WebServiceCallout.invoke()
per chiamare questi metodi multipart.
Come hai notato, il init
messaggio è composto da 4 parti:
- sessionId
- taskId
- initContext
- callbackContext
Ma WebServiceCallout.invoke()
accetterà solo un singolo parametro di richiesta come secondo argomento.
Potresti essere in grado di promuovere tutte le parti tranne una nelle intestazioni come per Importare UPS Street Address WSDL in Apex , ma ciò dipenderà da ciò che si aspetta il servizio web di destinazione.
Ci sono un paio di sfide con questo WSDL :
- Il
schema
definisce atargetNamespace
, ma omette l'xmlns
attributo. - Ci sono diversi elementi nello schema definiti come tipi complessi che hanno un elemento nidificato definito anche da un tipo complesso. Ad esempio
AsyncActivateResult > activateResult
.
(1) è stato facilmente risolto aggiungendo un xmlns
attributo allo schema in modo che corrispondesse a 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) è stato risolto estraendo gli elementi complexType annidati che li promuovono a discendenti diretti dello schema. Quindi gli elementi utilizzano il tipo risultante come riferimento anziché tentare di annidare 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>
La classe Apex risultante: webserviceEmbeddedServerQaBackendCo.cls