2010-02-14 3 views
12

Sto cercando di implementare un client per il servizio SOAP di National Rail Enquiries (http://www.livedepartureboards.co.uk/ldbws/).Azione SOAP WSDL

Applico il WSDL (http://realtime.nationalrail.co.uk/ldbws/wsdl.aspx) a http://soapclient.com/soaptest.html, ma torno il messaggio di errore "Impossibile gestire la richiesta senza un parametro di azione valido. Fornire un'azione sapone valida."; cosa diavolo dovrebbe essere l'azione?

Grazie, Stewart

edit:

ho appena usato soapclient.com come un esempio veloce. Nel mio software, invio il seguente XML; Ho ancora capito che mi manca un'azione.

<?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> 
+1

E 'probabile che la soapclient.com non piace il WSDL, per ragioni proprie. Il servizio web NRE funziona bene, però, l'ho usato io stesso. – skaffman

+0

Vedere http://stackoverflow.com/questions/128263/how-do-you-determine-a-valid-soapaction – Jono

+0

In breve, cercare il WSDL per soapAction. Vedere http://stackoverflow.com/questions/128263/how-do-you-determine-a-valid-soapaction – Jono

risposta

11

Se la sua un servizio SOAP 1.1, allora si dovrà anche includere un campo di intestazione SOAPAction HTTP:

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

+1

Ho così tanto ... ma non posso per la vita di me risolvere cosa dovrebbe essere nel campo SOAPAction. – Stewart

+1

Sarebbe la stessa cosa nel tuo corpo SOAP, ovvero GetDepartureBoardRequest o pienamente qualificato: http://thalesgroup.com/RTTI/2008-02-20/ldb/GetDepartureBoardRequest – mythz

+1

Ho provato quello, ma io get "Il server non ha riconosciuto il valore dell'intestazione HTTP SOAPAction: GetDepartureBoardRequest" – Stewart

4

mi sono imbattuto esattamente lo stesso problema quando si cerca di scrivere un client per il servizio SOAP National Rail con Perl.

Il problema è stato causato perché il modulo Perl che sto usando 'SOAP :: Lite' inserisce un '#' nell'intestazione SOAPAction ...

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

Questo non viene interpretata correttamente da .NET server. Ho trovato questo dall'esempio 3-19 in O'Reilly's Programming Web Services with SOAP. La soluzione è stata fornita di seguito nella sezione 3-20, vale a dire che è necessario specificare esplicitamente il formato dell'intestazione con il metodo '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"; 

La mia ipotesi è che soapclient.com sta usando SOAP :: Lite dietro le quinte e così stanno colpendo lo stesso problema quando si parla di National Rail.

La soluzione è scrivere il proprio client in modo da avere il controllo sul formato dell'intestazione SOAPAction ... ma probabilmente lo hai già fatto.

Richard

0

Ho appena trascorso un po 'cercando di ottenere questo al lavoro di un avere un scritto un Ruby gem che accede al API. Puoi leggere di più su questo è il project page.

Questo codice funziona 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 

Speranza che è utile per qualcuno!

0

Abbiamo creato Web Services su Windows Server e stavamo cercando di connetterci con PHP su Apache. Abbiamo lo stesso errore. Il problema si è rivelato essere diverse versioni del client Soap sui diversi server. La corrispondenza delle versioni SOAP nelle opzioni su entrambi i server ha risolto il problema nel nostro caso.

0

servizio hanno 4 operazioni: 1. GetServiceDetails 2. GetArrivalBoard 3. GetDepartureBoard 4.GetArrivalDepartureBoard

Implementation of web service

0

Quando soapAction manca nel SOAP 1.2 richiesta (e molti clienti non la imposti, anche quando è specificato in WSDL), alcuni server di applicazioni (ad es. JBoss) dedurre il "reale" soapAction da {xsd:import namespace}+{wsdl:operation name}. Così, per fare la dedotto "reale" soapAction partita l'atteso soapAction, è possibile impostare il soapAction dovrebbe {xsd:import namespace}+{wsdl:operation name} nella definizione WS (@WebMethod(action=...) per Java EE)

Eg. per un tipico caso di Java EE, questo aiuta (non il caso del Stewart, National Rail WS ha impostato 'soapAction'):

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

Se non è possibile modificare il server, si dovrà per forza cliente a riempire soapAction .

0

ho risolto questo problema, nel codice Java, aggiungendo:

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

SOAPAction è richiesto in SOAP 1.1, ma può essere vuoto ("").

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

"Il valore del campo intestazione stringa vuota (" ") significa che l'intento del messaggio SOAP è fornito dalla richiesta HTTP-URI".

impostazione SOAPAction = "Prova"