web-dev-qa-db-fra.com

SOAP Action WSDL

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

S'il s'agit d'un service SOAP 1.1, vous devrez également inclure un champ d'en-tête HTTP SOAPAction:

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

15
mythz

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

4
Richard Corfield

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 = ""

1
andre.wiik

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.

0
John the Helpful

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!

0
iHiD

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

Implementation of web service

0
antonio

J'ai résolu ce problème, en Java Code, en ajoutant:

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

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.

0
jessier3