SOAP Action WSDL

j'essaie d'implémenter un client pour le service SOAP de National Rail Enquiries (http://www.livedepartureboards.co.uk/ldbws/).

je colle le WSDL (http://realtime.nationalrail.co.uk/ldbws/wsdl.aspx) en http://soapclient.com/soaptest.html, mais je serai de retour le message d'erreur "Impossible de gérer la demande sans une action valide paramètre. Veuillez fournir un soap valide l'action."; ce qui sur terre si l'action l'être?

Merci, Stewart

edit:

je viens d'utiliser soapclient.com comme un exemple rapide. Dans mon logiciel, J'envoie le XML suivant; je comprends toujours que je manque une action.

<?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>
14
demandé sur Stewart 2010-02-15 00:08:22

8 réponses

si C'est un service SOAP 1.1, alors vous devrez aussi inclure un champ D'en-tête HTTP SOAPAction:

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

13
répondu mythz 2010-02-14 21:22:50

j'ai rencontré exactement le même problème en essayant d'écrire un client pour le service ferroviaire national SOAP avec Perl.

le problème a été causé parce que le module Perl que j'utilise 'SOAP::Lite' insère un '#' dans L'en-tête SOAPAction ...

SOAPAction: "http://thalesgroup.com/RTTI/2008-02-20/ldb/#GetDepartureBoard"

ceci n'est pas interprété correctement par les serveurs .NET. J'ai trouvé cela dans L'exemple 3-19 dans O'Reilly programmation de services Web avec SOAP . La solution a été donnée ci-dessous dans section 3-20, à savoir vous devez spécifier explicitement le format de l'en-tête avec la méthode "on_action".

print SOAP::Lite
  -> uri('urn:Example1')
  -> on_action(sub{sprintf '%s/%s', @_ })
  -> proxy('http://localhost:8080/helloworld/example1.asmx')
  -> sayHello($name)
  -> result . "\n\n";

a mon avis c'est ça soapclient.com utilise SOAP:: Lite dans les coulisses et ainsi de frapper le même problème en parlant à National Rail.

la solution est d'écrire votre propre client pour que vous ayez le contrôle sur le format de l'en-tête SOAPAction ... mais vous avez probablement déjà fait.

Richard

4
répondu Richard Corfield 2015-04-13 13:04:57

La savon est nécessaire dans SOAP 1.1 mais peut être vide ("").

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

"la valeur du champ d'en-tête de la chaîne vide ( "" ) signifie que l'intention du message SOAP est fournie par la requête HTTP-URI."

Essayez de définir SOAPAction=""

1
répondu andre.wiik 2016-04-08 08:22:49

je viens de passer un moment à essayer de faire en sorte que cela fonctionne et avoir un a écrit Ruby gem qui accède à L'API. Vous pouvez lire plus sur ce est page du projet.

C'est du code qui fonctionne en 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

j'Espère que c'est utile pour quelqu'un!

0
répondu iHiD 2012-06-08 14:43:39

nous avons mis en place des Services Web sur Windows Server et essayions de nous connecter avec PHP sur Apache. Nous avons eu la même erreur. Le problème a fini par être différentes versions du client Soap sur les différents serveurs. Faire correspondre les versions SOAP dans les options sur les deux serveurs a résolu le problème dans notre cas.

0
répondu jessier3 2012-10-11 11:33:45

le service a 4 opérations: 1. GetServiceDetails 2. GetArrivalBoard 3. GetDepartureBoard 4. GetArrivalDepartureBoard

Implementation of web service

0
répondu antonio 2013-02-08 00:54:28

Quand soapAction est absent de la requête SOAP 1.2 (et de nombreux clients ne la paramétrent pas, même lorsqu'elle est spécifiée dans WSDL), certains serveurs app (par ex. jboss) en déduire le "réel" soapAction{xsd:import namespace}+{wsdl:operation name}. Ainsi, pour rendre l'inféré "réel"soapAction correspondent aux soapAction, vous pouvez définir la soapAction attendue à {xsd:import namespace}+{wsdl:operation name} dans votre définition WS (@WebMethod(action=...) pour Java EE)

par exemple. pour un cas typique D'EE Java, cela aide (pas le cas de Stewart, National Rail WS a "soapAction" set):

@WebMethod(action = "http://packagename.of.your.webservice.class.com/methodName")

Si vous ne pouvez pas changer le serveur, vous devrez forcer le client à remplir soapAction.

0
répondu John the Helpful 2013-10-13 17:38:34

j'ai résolu ce problème, en code Java, en ajoutant:

 MimeHeaders headers = message.getMimeHeaders();
 headers.addHeader("SOAPAction", endpointURL);
0
répondu Antonios 2016-02-15 09:36:11