ColdFusion réponse SOAP avec des pièces jointes

J'utilise Coldfusion9 pour interagir avec un service tiers SOAP avec lequel j'ai besoin d'envoyer et de recevoir du SOAP avec des pièces jointes. Je n'ai aucun problème à recevoir le SOAP qui peut ou ne peut pas avoir des attachements binaires en utilisant ToString() autour du contenu HTTP pour convertir le corps du SOAP en chaîne utilisable, cependant le service exige que je renvoie ma réponse en utilisant des attachements ainsi qui est où je me défasse. Je n'ai jamais fait ça dans ColdFusion et je ne suis pas exactement c'est sûr que je devrais présenter ça au service d'origine pour que le corps SOAP soit référencé via un ID.

ci-dessous est l'analyse des données SOAP entrantes avec des pièces jointes:

<cfset soapData = GetHttpRequestData()>

<!--- Loop over the HTTP headers and dump the SOAP content into a variable --->
<cfsavecontent variable="soapContent">
<cfoutput>      
    <cfloop collection = #soapData.headers# item = "http_item">
    #http_item#: #StructFind(soapData.headers, http_item)# #chr(10)##chr(13)# 
    </cfloop>
    request_method: #soapData.method# #chr(10)##chr(13)# 
    server_protocol: #soapData.protocol# #chr(10)##chr(13)# 
    http_content --- #chr(10)##chr(13)#  
    #toString(soapData.content)#
</cfoutput>
</cfsavecontent>

<!--- Save file to flat file --->
<cffile action = "write" 
    file = "#expandPath('../')#logs/#dateFormat(now(),'dd-mm-yyyy')#_#timeFormat(now(),'HHmmss')#.txt" 
    output = "#soapContent#">

maintenant je présente actuellement la réponse comme une réponse XML SOAP complète contenant le corps comme XML inline avec le STATUSCODE requis (voir ci-dessous).

<cfsavecontent variable="strResponse">
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance">
    <SOAPENV:Body>
        <ns1:processResponse xmlns:ns1="urn:TripFlow" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
            <STATUSLVL>00</STATUSLVL>
        </ns1:processResponse>
    </SOAP-ENV:Body>
</SOAPENV:Envelope>
</cfsavecontent>

<!--- Strip all whitespace between tags --->
<cfset strResponse = trim(ReReplaceNoCase(strResponse,'(>[s]*<)','><','ALL'))>

<!--- Output the XML response to the soap service --->
<cfoutput>#strResponse#</cfoutput>

la réponse ci-dessus envoie une erreur parce que le service SOAP exige que la réponse soit envoyée référencement du message du corps comme pièce jointe exactement comme suit de la documentation:

HTTP/1.1 200 OK
Date: Thu, 01 Apr 2010 09:30:25 GMT
Server: Jetty/5.1.4 (Windows XP/5.1 x86 java/1.5.0_15
Content-Type: multipart/related; boundary=soaptestserver; type="text/xml"; start="<theenvelope>"
SOAPAction: ""
Content-Length: 796
Connection: close

--soaptestserver
Content-ID: <theenvelope>
Content-Transfer-Encoding: 8bit
Content-Type: text/xml; charset=utf-8
Content-Length: 442

<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAPENV="
http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"><SOAPENV:
Body><ns1:processResponse xmlns:ns1="urn:TripFlow" SOAPENV:
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><message
href="cid:thecontentmessage"/></ns1:processResponse></SOAP-ENV:Body></SOAPENV:
Envelope>

--soaptestserver
SOAP Interface
www.travelsolutions.com 123
travel solutions online V14.0 External System Integration
Content-ID: <thecontentmessage>
Content-Transfer-Encoding: 8bit
Content-Type: text/xml; charset=utf-8
Content-Length: 65

<?xml version="1.0" encoding="UTF-8"?><STATUSLVL>00</STATUSLVL>
--soaptestserver--

toute aide serait grandement appréciée car je me frappe vraiment la tête contre un mur sur celui-ci. Merci!

33
demandé sur Phil Rasmussen 2011-02-14 03:56:46

2 réponses

Cela fait longtemps que je n'ai pas travaillé avec ColdFusion. La dernière fois que je me souviens, il n'a pas fourni un harnais pour envoyer un accessoire de savon. J'ai résolu ce problème en écrivant un custom CFX balise avec Java qu'il a fait pour moi. Tout L'appel du SOAP devra passer par l'étiquette.

La bibliothèque Java que vous voulez regarder si vous choisissez de le faire est javax-ws. Vous devez également savoir si L'appel de service doit utiliser MTOM.

Désolé, ce n'est pas un solution directe, mais c'est ce que J'ai dû faire avec les FC il y a quelques versions.

1
répondu Chad 2011-05-05 15:43:37

chaque fois que j'interagis avec les services de SOAP, je finis par utiliser quelque chose de similaire. Ça marche généralement. Notez que j'ai du texte de place-holder là-dedans que vous auriez besoin de remplacer par les valeurs appropriées pour votre fournisseur tiers.

<cfsavecontent variable="soap">
<?xml version="1.0" encoding="UTF-8" ?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance">
   <soapenv:Header/>
   <soapenv:Body>
      <ns1:processResponse xmlns:ns1="urn:TripFlow" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <statuslvl>00</statuslvl>
      </ns1:processResponse>
   </soapenv:Body>
</soapenv:Envelope>
</cfsavecontent>

<!--- Invoke web service to send message--->
<cfhttp url="http://3rd-party-url-here" method="post" timeout="10">
<cfhttpparam type="header" name="content-type" value="text/xml" />
<cfhttpparam type="header" name="SOAPAction" value="""3rd-party-method-name-here""" />
<!---<cfhttpparam type="header" name="accept-encoding" value="no-compression" />  sometimes this is needed --->
<cfhttpparam type="header" name="content-length" value="#len(soap)#" />
<cfhttpparam type="header" name="charset" value="utf-8" />
<cfhttpparam type="xml" name="message" value="#trim(soap)#" />
</cfhttp> 
1
répondu Miguel-F 2012-09-06 15:41:25