Ich versuche, einen Client für den SOAP Service von National Rail Inquiries ( http://www.livedepartureboards.co.uk/ldbws/ ) zu implementieren.
Ich stecke die WSDL ( http://realtime.nationalrail.co.uk/ldbws/wsdl.aspx ) in http://soapclient.com/soaptest.html , bekomme aber den Fehler zurück message "Anfrage kann ohne gültigen Aktionsparameter nicht verarbeitet werden. Bitte geben Sie eine gültige Seifenaktion an."; Was in aller Welt soll die Aktion sein?
Danke, Stewart
bearbeiten:
Ich habe nur soapclient.com als schnelles Beispiel verwendet. In meiner Software sende ich das folgende XML; Ich verstehe immer noch, dass mir eine Aktion fehlt.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://thalesgroup.com/RTTI/2008-02-20/ldb/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:ldbt2="http://thalesgroup.com/RTTI/2008-02-20/ldb/types" xmlns:ldbt="http://thalesgroup.com/RTTI/2007-10-10/ldb/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ct="http://thalesgroup.com/RTTI/2007-10-10/ldb/commontypes" >
<SOAP-ENV:Body>
<ldbt2:GetDepartureBoardRequest xmlns:ldbt2="http://thalesgroup.com/RTTI/2008-02-20/ldb/" >
<ldbt2:numRows>5</ldbt2:numRows>
<ldbt2:crs>WAT</ldbt2:crs>
<ldbt2:filterCrs>GLD</ldbt2:filterCrs>
<ldbt2:filterType>to</ldbt2:filterType>
<ldbt2:timeOffset>0</ldbt2:timeOffset>
</ldbt2:GetDepartureBoardRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Wenn es sich um einen SOAP 1.1-Dienst handelt, müssen Sie auch ein SOAPAction-HTTP-Headerfeld angeben:
Beim Versuch, einen Client für den National Rail SOAP - Dienst mit Perl zu schreiben, bin ich auf dasselbe Problem gestoßen.
Das Problem wurde dadurch verursacht, dass das Perl-Modul, das ich 'SOAP :: Lite' verwende, ein '#' in den SOAPAction-Header einfügt.
SOAPAction: "http://thalesgroup.com/RTTI/2008-02-20/ldb/#GetDepartureBoard"
Dies wird von .NET-Servern nicht richtig interpretiert. Ich habe dies aus Beispiel 3-19 in O'Reillys Programming Web Services mit SOAP herausgefunden. Die Lösung wurde unten in Abschnitt 3-20 gegeben. Sie müssen das Format des Headers explizit mit der 'on_action'-Methode angeben.
print SOAP::Lite
-> uri('urn:Example1')
-> on_action(sub{sprintf '%s/%s', @_ })
-> proxy('http://localhost:8080/helloworld/example1.asmx')
-> sayHello($name)
-> result . "\n\n";
Meine Vermutung ist, dass soapclient.com SOAP :: Lite im Hintergrund verwendet und daher das gleiche Problem hat, wenn Sie mit National Rail sprechen.
Die Lösung besteht darin, einen eigenen Client zu schreiben, damit Sie das Format des SOAPAction-Headers steuern können ... aber das haben Sie wahrscheinlich schon getan.
Richard
SOAPAction ist in SOAP 1.1 erforderlich, kann jedoch leer sein ("").
Siehe https://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383528
"Der Headerfeldwert der leeren Zeichenfolge (" ") bedeutet, dass die Absicht der Nachricht SOAP vom HTTP-Request-URI bereitgestellt wird."
Versuchen Sie, SOAPAction = "" einzustellen.
Wenn soapAction
in der Anforderung SOAP 1.2 fehlt (und viele Clients es nicht festlegen, auch wenn es in WSDL angegeben ist), leiten einige App-Server (z. B. jboss) die "tatsächlichen" soapAction
von {xsd:import namespace}+{wsdl:operation name}
. Damit die abgeleitete "tatsächliche" soapAction
mit der erwarteten soapAction
übereinstimmt, können Sie die erwartete soapAction in Ihrer WS-Definition ({xsd:import namespace}+{wsdl:operation name}
) für Java EE auf @WebMethod(action=...
setzen.
Z.B. Für einen typischen Java EE-Fall ist dies hilfreich (anders als bei Stewart, bei National Rail WS ist 'soapAction' festgelegt):
@WebMethod(action = "http://packagename.of.your.webservice.class.com/methodName")
Wenn Sie den Server nicht ändern können, müssen Sie den Client zwingen, soapAction
auszufüllen.
Ich habe gerade eine Weile damit verbracht, zu versuchen, dies zum Laufen zu bringen und einen Ruby-Edelstein zu haben, der auf die API zugreift. Sie können mehr auf seiner Projektseite lesen.
Dies ist der Arbeitscode in Ruby:
require 'savon'
client = Savon::Client.new do
wsdl.document = "http://realtime.nationalrail.co.uk/LDBWS/wsdl.aspx"
end
response = client.request 'http://thalesgroup.com/RTTI/2012-01-13/ldb/GetDepartureBoard' do
namespaces = {
"xmlns:soap" => "http://schemas.xmlsoap.org/soap/envelope/",
"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
"xmlns:xsd" => "http://www.w3.org/2001/XMLSchema"
}
soap.xml do |xml|
xml.soap(:Envelope, namespaces) do |xml|
xml.soap(:Header) do |xml|
xml.AccessToken do |xml|
xml.TokenValue('ENTER YOUR TOKEN HERE')
end
end
xml.soap(:Body) do |xml|
xml.GetDepartureBoardRequest(xmlns: "http://thalesgroup.com/RTTI/2012-01-13/ldb/types") do |xml|
xml.numRows(10)
xml.crs("BHM")
xml.filterCrs("BHM")
xml.filterType("to")
end
end
end
end
end
p response.body
Hoffe das ist hilfreich für jemanden!
der Dienst hat 4 Operationen: 1. GetServiceDetails 2. GetArrivalBoard 3. GetDepartureBoard 4. GetArrivalDepartureBoard
Ich habe dieses Problem in Java-Code gelöst und hinzugefügt:
MimeHeaders headers = message.getMimeHeaders();
headers.addHeader("SOAPAction", endpointURL);
Wir haben Web Services auf Windows Server zusammengestellt und haben versucht, eine Verbindung zu PHP unter Apache herzustellen. Wir haben den gleichen Fehler. Das Problem waren unterschiedliche Versionen des Soap-Clients auf den verschiedenen Servern. Durch das Übereinstimmen der SOAP -Versionen in den Optionen auf beiden Servern wurde das Problem in unserem Fall behoben.