2017-01-18 5 views
0

Momentan verwende ich die STOMP-Bibliothek (http://jasonrbriggs.github.io/stomp.py) für Python zum Senden und Empfangen von SOAP-Nachrichten, die in einer ActiveMQ-Instanz gespeichert sind. Dieser ActiveMQ ist mit einem WSO2-ESB verbunden, der so konfiguriert wurde, dass Nachrichten basierend auf ihrem Inhaltstyp und/oder SoapAction grundsätzlich in verschiedenen Feldern angeordnet werden.Python-Include-Datei in XML-Nachricht

Ich arbeite gerade in einem Stück Python-Software und habe nur über ein bestimmtes Konto Zugriff auf dieses ActiveMQ. Es wird erwartet, dass ich mit stomp.py an die Warteschlange sende und empfange. Ich habe dies erfolgreich in beide Richtungen mit nur SOAP-Nachrichten getan. Ich würde den Body in XML konstruieren und die Header leer lassen.

Jetzt wurde die Frage gestellt, stattdessen SOAP mit Attachments (SwA) zu verwenden, da auch Anhänge erforderlich sind. Ich weiß, dass das System, das letztlich diese Nachrichten empfängt, nicht noch handle MTOM, so dass ich bin mit dem Senden von SwA-Nachrichten verlassen.

Ich habe den Content-Type in der Kopfzeile bereits mit application/octet-stream versehen, aber ich kann nicht für das Leben von mir herausfinden, wie man die Dateien selbst tatsächlich in diese Nachrichten einbaut.

Um die Nachrichten auszusenden ich den XML-Körper, Kopf-in-Wörterbuch Form konstruieren und dieses Stück Code verwenden:

conn = self._build_connection()[0] 
    destination = self.subscription_id.queue_name 
    # Connect to the server 
    conn.connect(username=self.env.user.company_id.login_name, password=self.env.user.company_id.password) 
    # Send the actual message out 
    conn.send(destination, self.body, headers=self.header) 
    conn.disconnect() 

„_build_connection“ bietet mir nur mit einer Verbindung zur gewünschten ActiveMQ Queue. Wenn dies für die Antwort relevant ist, lass es mich wissen.

Ich habe das Gefühl, dass ich ziemlich nah an einer funktionierenden Lösung bin, aber ich versage einfach das so fehlende Glied. ------------------ BEARBEITEN ----------------

Ich sehe jetzt, dass ich in die falsche Richtung schaute . Das Einfügen von Anhängen in SOAP-Nachrichten ist mein Problem, die Nachrichten nicht an ActiveMQ zu erhalten. Ich habe auch bemerkt, dass die Nachricht eine einzelne Datei/ein Anruf an ActiveMQ sein wird, also muss ich meine Frage neu formulieren.

Das sagte ich gerade versuche herauszufinden, wie man mit PySimpleSoap arbeiten, um meine Nachricht zu konstruieren. Wird aktualisiert, sobald dies funktioniert hat.

------------------ EDIT2 ----------------

A rephrase meiner Frage. Angenommen, ich habe diese einfache Seife Nachricht, die ich für Python mit dem Standard ElementTree Bibliothek erstellt:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tec="someURLtech"> 
    <soapenv:Header/> 
     <soapenv:Body> 
      <tec:SomethingTechnical> 
       <tec:SomeValue>140</tec:SomeValue> 
      </SomethingTechnical> 
     </soapenv:Body> 
    </soapenv:Envelope> 

Und ich wollte hinzugefügt eine Anlage müssen diese SwA verwenden, würde ich dafür sorgen müssen es irgendwie innerhalb der ist umhüllen.

Ich habe bereits this link to another question on the differences between SwA and MTOM gefunden, aber ich sehe einfach nicht, wo ich angeben sollte, dass die fragliche Datei tatsächlich ein Bild ist (zum Beispiel) und wo die tatsächlichen base64-kodierten Daten dafür abgelegt werden. Hinweis: Ich weiß, wie ich diese erhalten kann. Ich frage einfach, wie ich diese auf eine Weise positionieren kann, die in XML akzeptiert wird.

Der Grund für die Frage ist, dass die Zielanwendung WSDL (die ich leider nicht freigeben darf) hat ein Tag für Anhänge, aber kein Tag für die tatsächlichen Daten (like) oder etwas ähnliches.

Wieder habe ich das Gefühl, dass ich den Punkt hier völlig vermisse und wäre dankbar, wenn jemand das erklären könnte.

Beachten Sie auch, dass ich nur die Nachricht gemäß der bereitgestellten WSDL erstellen muss, nicht den Webservice tatsächlich verwenden. Ich werde die Nachricht auf dem ESB in ActiveMQ veröffentlichen. Ich versuche, PySimpleSoap zu verwenden, aber dort auch andere Probleme zu laufen, also verfolge ich nicht die WSDL-Datei.

Antwort

0

Sie sollten für Beispielnachrichten/Beispiele herum google. Ich habe eine verwandte StackOverflow-Frage verknüpft.

SOAP mit Anlagen ist ein Bereich, in dem es eine Reihe von Ansätzen gibt, und Sie müssen sicherstellen, dass Sie sich mit dem Zieldienst ausrichten. Ich schlage vor, ein Tool wie SOAPUI zu verwenden, um die Nachrichtennutzlasten zu erstellen, die Sie dann manuell testen können. Sobald Sie das Format heruntergefahren haben, sollte das Konstruieren in Python direkt erfolgen - entweder mithilfe einer vorhandenen Python-SOAP-Bibliothek oder manuell als letzter Ausweg.

  1. Verwandte SO Frage: How to send a file through Soap in python?
  2. SOAP UI: https://www.soapui.org/
  3. w3 spec: https://www.w3.org/TR/SOAP-attachments

Hinweis: Dies ist nicht auf ActiveMQ bezogen, wie ActiveMQ eine textbasierte Nutzlast über nehmen STOMP unabhängig von SOAP mit oder ohne Anhänge. Wahrscheinlich ist es eine gute Idee, das ActiveMQ-Tag zu entfernen, um den Zorn der Stack-Überlaufwächter zu vermeiden.

+0

Vielen Dank für die Antwort. Ich benutze tatsächlich bereits SoapUI, um bestimmte Funktionen zu testen, aber ich habe vergessen, das zu erwähnen. Außerdem werde ich versuchen, morgen in meinem Eröffnungsbeitrag ein wenig mehr zu erklären, wo ich "stecken geblieben" bin. Lasst mich zuerst die angegebenen Spezifikationen lesen. – Ludo21South

+0

Ich habe die ursprüngliche Frage mit einer genaueren Beschreibung bearbeitet. Hoffentlich ist das nur etwas Offensichtliches, auf das leicht hingewiesen werden kann. – Ludo21South