2011-02-14 19 views
33

Estoy utilizando Coldfusion9 para interactuar con un servicio SOAP de terceros con el cual necesito enviar y recibir SOAP con archivos adjuntos. No tengo problemas para recibir el SOAP que puede o no tener archivos adjuntos binarios mediante el uso de ToString() alrededor del contenido HTTP para convertir el cuerpo de SOAP en una cadena utilizable, sin embargo, el servicio requiere que envíe mi respuesta utilizando archivos adjuntos. que es donde estoy deshaciendo. Nunca he hecho esto en ColdFusion y no estoy exactamente seguro de cómo debería presentar esto al servicio de origen para que el cuerpo SOAP se haga referencia a través de una identificación.ColdFusion respuesta SOAP con archivos adjuntos

A continuación se muestra el análisis de los datos SOAP de entrada con archivos adjuntos:

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

Ahora actualmente estoy presentando la respuesta como una respuesta XML de SOAP completa que contiene el cuerpo como XML en línea con el statuscode requerida (véase más adelante) .

<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 respuesta anterior es tirar un error porque el servicio SOAP requiere que la respuesta sea enviado referencia al cuerpo del mensaje como un archivo adjunto exactamente como se desprende de la documentación:

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

Cualquier ayuda sería grandemente aprecio como realmente estoy golpeando mi cabeza contra una pared en este caso. ¡Gracias!

+1

No es algo con lo que haya jugado. Parece que estás intentando construir una cadena para la solicitud; Supongo que estás acertando ya sea un XML mal formado o un problema de espacio de nombres. En lugar de crear cadenas, utilizaría el soporte XML de ColdFusion y la función 'AddSOAPRequestHeader()': http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_a-b_03.html#5050827 el enlace tiene un ejemplo de enviar y consumir SOAP. – orangepips

+0

Bueno, los desarrolladores en el otro extremo básicamente han dicho que sus registros muestran que estoy tratando de enviar la respuesta dentro del cuerpo de SOAP directo cuando de hecho tengo que incluirlo como un archivo adjunto o no funcionará. Entonces, la línea de respuesta " " debe ser referenciada dentro de la respuesta SOAP principal y esto es de lo que no estoy seguro en CF. Casi ve como una referencia de hipervínculo dentro de las solicitudes SOAP. Por qué lo quieren de esta manera es otra cuestión en conjunto ya que esto parece ser algo complicado: S –

+0

Comprender. Sugeriría estudiar cómo ColdFusion te permite hacer algo como: 'ws = createObject ('webservice', 'http: //domain/file.ext? Wsdl')' donde puedes hacer 'ws.method (argument = value) 'llamadas. Mi primer enlace demuestra eso. – orangepips

Respuesta

1

Ha pasado un tiempo desde que trabajé con ColdFusion. Lo último que recuerdo es que no proporcionaba un arnés para enviar un archivo adjunto SOAP. Resolví este problema escribiendo una etiqueta custom CFX con Java que lo hizo por mí. Toda la llamada SOAP deberá pasar por la etiqueta.

La biblioteca de Java que desea ver si elige hacer esto es javax-ws. También debe averiguar si la llamada de servicio debe usar MTOM.

Lo siento, pero no es una solución directa, pero es lo que tuve que hacer con CF algunas versiones atrás.

+0

Hola Chad, actualmente no tenemos recursos de Java dentro del equipo, así que esta opción sería un poco complicada y requeriría intervención externa, y realmente esperaba una respuesta definitiva de sí/no para usar CF9 puramente para lograr esta respuesta SOAP que parece cerca de ser posible, pero parece que estaba usando una versión anterior de CF y probablemente no fue compatible entonces. –

+0

Disculpas por la demora en la respuesta ¡Ha sido una larga licencia anual y un tiempo desde que volví a SO! –

1

Cada vez que interactúo con servicios SOAP generalmente termino usando algo similar a esto. Por lo general, funciona Tenga en cuenta que tengo algún texto de marcador de posición allí que debería reemplazar con los valores adecuados para su proveedor de terceros.

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