33 Stimmen

ColdFusion SOAP-Antwort mit Anhängen

Ich verwende Coldfusion9, um mit einem SOAP-Dienst eines Drittanbieters zu interagieren, mit dem ich sowohl SOAP mit Anhängen senden als auch empfangen muss. Ich habe kein Problem beim Empfangen der SOAP, die binäre Anhänge haben kann oder nicht, indem Sie ToString() um den HTTP-Inhalt, um den SOAP-Body in eine brauchbare Zeichenfolge zu konvertieren, aber der Dienst erfordert, dass ich meine Antwort zurück mit Anhängen als auch, wo ich komme ungeschehen. Ich habe nur noch nie getan dies in ColdFusion und ich bin nicht genau sicher, wie ich sollte dies an den ursprünglichen Dienst zu präsentieren, so dass der SOAP-Body über eine ID referenziert wird.

Im Folgenden wird das Parsing der eingehenden SOAP-Daten mit Anhängen dargestellt:

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

Jetzt präsentiere ich die Antwort als vollständige SOAP-XML-Antwort, die den Body als Inline-XML mit dem erforderlichen STATUSCODE enthält (siehe unten).

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

Die obige Antwort führt zu einem Fehler, da der SOAP-Dienst verlangt, dass die Antwort mit Verweis auf den Nachrichtentext als Anhang gesendet wird, genau wie in der Dokumentation beschrieben:

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

Für jede Hilfe wäre ich sehr dankbar, da ich hier wirklich mit dem Kopf gegen die Wand stoße. Danke!

1voto

Chad Punkte 255

Es ist eine Weile her, dass ich mit ColdFusion gearbeitet habe. Soweit ich mich erinnere, bot es keine Möglichkeit, einen SOAP-Anhang zu senden. Ich habe dieses Problem gelöst, indem ich ein benutzerdefiniertes CFX Tag mit Java, der es für mich erledigt hat. Der gesamte SOAP-Aufruf muss über das Tag laufen.

Die Java-Bibliothek, die Sie sich ansehen sollten, wenn Sie dies tun wollen, ist javax-ws . Sie müssen auch herausfinden, ob der Dienstabruf MTOM verwenden muss.

Es tut mir leid, dass das keine direkte Lösung ist, aber das ist es, was ich mit CF vor ein paar Versionen tun musste.

1voto

Miguel-F Punkte 13390

Wann immer ich mit SOAP-Diensten interagiere, verwende ich in der Regel etwas Ähnliches wie dieses. Das funktioniert im Allgemeinen. Beachten Sie, dass ich einige Platzhalter-Text in dort haben, die Sie mit den entsprechenden Werten für Ihre 3rd-Party-Anbieter ersetzen müssen würde.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X