web-dev-qa-db-de.com

SOAP Aktion WSDL

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

Wenn es sich um einen SOAP 1.1-Dienst handelt, müssen Sie auch ein SOAPAction-HTTP-Headerfeld angeben:

http://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383528

15
mythz

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

4

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.

1
andre.wiik

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.

0

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!

0
iHiD

der Dienst hat 4 Operationen: 1. GetServiceDetails 2. GetArrivalBoard 3. GetDepartureBoard 4. GetArrivalDepartureBoard

Implementation of web service

0
antonio

Ich habe dieses Problem in Java-Code gelöst und hinzugefügt:

 MimeHeaders headers = message.getMimeHeaders();
 headers.addHeader("SOAPAction", endpointURL);
0
Antonios

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.

0
jessier3