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!
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
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 " Xml version =" 1.0 "encoding =" UTF-8 "?> " 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 –
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