Warum ist "wsdl" namespace warf in Aktion bei der Verwendung von savon für die ruby-soap-Kommunikation?
Ich versuche, Zugriff auf einen SOAP-service, den ich nicht kontrollieren. Eine der Aktionen nennt ProcessMessage
. Ich folgte dem Beispiel und generiert eine SOAP-Anfrage, aber ich bekam einen Fehler zurück und sagte, dass die Aktion nicht vorhanden ist. Ich verfolgte das problem auf die Art und Weise der Körper der Hülle erzeugt wird.
<env:Envelope ... ">
<env:Header>
<wsse:Security ... ">
<wsse:UsernameToken ...">
<wsse:Username>USER</wsse:Username>
<wsse:Nonce>658e702d5feff1777a6c741847239eb5d6d86e48</wsse:Nonce>
<wsu:Created>2010-02-18T02:05:25Z</wsu:Created>
<wsse:Password ... >password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</env:Header>
<env:Body>
<wsdl:ProcessMessage>
<payload>
......
</payload>
</wsdl:ProcessMessage>
</env:Body>
</env:Envelope>
Dass ProcessMessage
tag sollte sein:
<ProcessMessage xmlns="http://www.starstandards.org/webservices/2005/10/transport">
Das ist, was es ist, wenn es erzeugt wird, durch die Beispiel-Java-app, und es funktioniert. Diesem tag der einzige Unterschied zwischen dem, was meine Ruby app erzeugt und die Beispiel-Java-app. Gibt es eine Möglichkeit, um loszuwerden, das "wsdl:"
namespace vor, dass ein tag und ein Attribut hinzuzufügen, das wie. Abgesehen von, dass, gibt es eine Möglichkeit zu zwingen, die Aktion nicht generiert werden, indem nur die als Zeichenfolge übergeben, wie der rest des Körpers?
Hier ist mein code:
require 'rubygems'
require 'savon'
client = Savon::Client.new "https://gmservices.pp.gm.com/ProcessMessage?wsdl"
response = client.process_message! do | soap, wsse |
wsse.username = "USER"
wsse.password = "password"
soap.namespace = "http://www.starstandards.org/webservices/2005/10/transport" #makes no difference
soap.action = "ProcessMessage" #makes no difference
soap.input = "ProcessMessage" #makes no difference
#my body at this point is jsut one big xml string
soap.body = "<payload>...</payload>"
# putting <ProccessMessage> tag here doesn't help as it just creates a duplicate tag in the body, since Savon keeps interjecting <wsdl:ProcessMessage> tag.
end
Ich habe versucht, handsoap, aber es nicht unterstützt HTTPS und ist verwirrend. Ich habe versucht, soap4r aber aber es ist noch mehr verwirrend als handsoap.
- ein ticket wurde geöffnet, unter: github.com/rubiii/savon/issues#issue/39
- Hi Nick, hast du irgendwo mit diesem, wie ich sehe das gleiche Problem.
- Hallo Steve. Ich lege diesen Teil des Projekts auf dem status "warten" - da gab es andere, wichtigere, Funktionen benötigen, die Umsetzung, und das war auf eine "nice to have" - Liste. Ich werde versuchen, Ihre Lösung noch heute und sehen, ob funktioniert. Vielen Dank für das lassen mich wissen, du!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie ein array übergeben, um Seife.Eingang das zweite element ist ein hash, der die namespace-details.
Diese sollten sicherstellen, dass Sie am Ende mit dem Namen space Erklärung als ein Attribut, das wichtigste element ist.
Werden Sie wahrscheinlich auch am Ende mit einer Namensraum-Deklaration, bevor Sie das element, wie so
aber das war kein Problem für mich, es war der Mangel der namespace-Attribut, das war das Problem, nicht das Vorhandensein der namespace vor dem element.
Für meine web-service, den ich brauchte, um loszuwerden, das
"wsdl"
namespace auf der Oberseite von Steve ' s Lösung.Getestet mit Savon 0.9.6:
Steve, sehen Sie, dass wsdl: vor der ProcessMessage-tag? - Ich dachte, das war das einzige, was warf mich aus aber nicht ( by the way es ist schwer, legen Sie Sie in Seife.rb Savon lib auf Zeile 160). Dass, auch wenn ich nicht spacify es in Seife.namespaces - es ist schwer, generiert und an den letzten xml. Was nicht erlaubt ist von meinem service.
Während der xml-Datei generiert wird, ist ein gültiges xml - es ist nicht vollständig von den requirments der service, den ich versuche mit Ihr zu reden. I. e.: in der generierten xml -,
tag fehlt, auch ich brauche PayloadManifest in der Kopfzeile,plus ich brauche wsu:created und wsu:expires in meinem wsse: tag -, aber Sie werden nicht umgesetzt etc., etc. ein paar andere kleine Macken, die zu spezifisch zu meinem Fall. Aber Seife hat eine private Methode = xml_body. Auch soap-lib in to_xml-Methode wird überprüft, ob @xml_body wurde bereits eingestellt, bevor Ihre Erzeugung eigener xml. So landete ich also etwas ändern das Verhalten der Seife. durch die Herstellung von Seife.xml_body = öffentlich zugänglich. Also ich war in der Lage zu tun:
Die funktioniert endlich!!!!
Ich werde vorschlagen, diese zu rubii - wenn diese option zur Verfügung steht, die lösen eine Menge der seltenen Fälle, in dem Menschen erzeugen kann, die Ihre benutzerdefinierte xml-und den rest der savon lib.