33 votes

Réponse ColdFusion SOAP avec pièces jointes

Je suis à l'aide de Coldfusion9 pour interagir avec un 3ème partie service SOAP avec qui j'ai besoin à la fois envoyer et recevoir du SAVON avec des pièces jointes. Je vais avoir pas de problème à la réception du SAVON, qui peut ou peut ne pas avoir de pièces jointes binaires en utilisant les méthodes ToString() autour de l'adresse HTTP du contenu pour convertir le SAVON Corps utilisable à chaîne, cependant, le service, je dois envoyer ma réponse à l'aide de pièces jointes et qui est l'endroit où je suis coming undone. Je n'ai simplement jamais fait cela dans ColdFusion et je ne sais pas exactement comment je dois présenter ce à l'origine d'un service, afin que le SAVON corps est référencé par un IDENTIFIANT.

Ci-dessous l'analyse de l'entrée de SAVON de données avec les 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 suis actuellement en train de présenter la réponse complète de SAVON réponse XML contenant le corps en ligne XML avec le STATUSCODE (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 est de lancer une erreur parce que le SAVON service nécessite la réponse à envoyer référencement le corps du message en tant que pièce jointe exactement comme suit à partir 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écier comme je suis vraiment frapper ma tête contre un mur sur celle-ci. Merci!

1voto

Chad Points 210

Il a été un moment depuis que j'ai travaillé avec ColdFusion. La dernière je me souviens, il n'a pas de fournir un harnais pour envoyer un SAVON pièce jointe. J'ai résolu ce problème en écrivant un personnalisé CFX tag avec Java qu'il a fait pour moi. L'intégralité de l'appel SOAP sera nécessaire de passer par la balise.

La bibliothèque Java que vous voulez regarder si vous choisissez de le faire est javax-ws. Vous devez également savoir si les appels de service à utiliser MTOM.

Désolé ce n'est pas une solution directe, mais c'est ce que j'avais à faire avec FC, quelques versions de retour.

1voto

Miguel-F Points 6540

Chaque fois que j'interagis avec des services SOAP, je finis généralement par utiliser quelque chose de similaire. Cela fonctionne généralement. Notez que le texte d’emplacement réservé que vous devez remplacer par les valeurs appropriées pour votre fournisseur tiers est indiqué.

 <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> 
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X