J'essaie de mettre en place 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 ) dans http://soapclient.com/soaptest.html , mais je récupère l'erreur message "Impossible de gérer la requête sans paramètre d'action valide. Veuillez fournir une action soap valide."; que devrait être l'action?
Merci, Stewart
modifier:
J'ai juste utilisé soapclient.com comme exemple rapide. Dans mon logiciel, j'envoie le code XML suivant; Je comprends toujours qu'il me 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>
S'il s'agit d'un service SOAP 1.1, vous devrez également inclure un champ d'en-tête HTTP SOAPAction:
J'ai rencontré exactement le même problème lorsque j'essayais d'écrire un client pour le service National Rail SOAP avec Perl.
Le problème était dû au fait 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 de O'Reilly programmation de services Web avec SOAP. La solution a été donnée ci-dessous dans la section 3-20, à savoir que 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";
Selon moi, soapclient.com utilise SOAP :: Lite en coulisse et rencontre donc le même problème en parlant à National Rail.
La solution consiste à écrire votre propre client afin de pouvoir contrôler le format de l'en-tête SOAPAction ... mais vous l'avez probablement déjà fait.
Richard
SOAPAction est requis 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 chaîne vide (" ") signifie que l'intention du message SOAP est fournie par l'URI de demande HTTP."
Essayez de définir SOAPAction = ""
Lorsque soapAction
est manquant dans la demande SOAP 1.2 (et de nombreux clients ne le définissent pas, même s'il est spécifié dans WSDL), certains serveurs d'applications (par exemple, jboss) infèrent le "réel". soapAction
de {xsd:import namespace}+{wsdl:operation name}
. Ainsi, pour que le "réel" inféré soapAction
corresponde au soapAction
attendu, vous pouvez définir le soapAction attendu sur {xsd:import namespace}+{wsdl:operation name}
dans votre définition WS (@WebMethod(action=...
) pour Java EE)
Par exemple. pour un cas typique Java EE, cela aide (pas le cas de Stewart, National Rail WS a le jeu 'soapAction'):
@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
.
Je viens de passer un certain temps à essayer de faire en sorte que cela fonctionne et avoir écrit un Ruby gem qui accède à l'API. Vous pouvez en lire plus sur la page du projet .
Ce code fonctionne dans 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!
le service a 4 opérations: 1. GetServiceDetails 2. GetArrivalBoard 3. GetDepartureBoard 4. GetArrivalDepartureBoard
J'ai résolu ce problème, en Java Code, en ajoutant:
MimeHeaders headers = message.getMimeHeaders();
headers.addHeader("SOAPAction", endpointURL);
Nous avons mis en place des services Web sur Windows Server et nous essayions de nous connecter avec PHP sur Apache. Nous avons la même erreur. Le problème a fini par être différentes versions du client Soap sur les différents serveurs. La correspondance des versions SOAP dans les options des deux serveurs a résolu le problème dans notre cas.