2010-02-14 165 views
12

Estoy tratando de implementar un cliente para el Servicio SOAP de National Rail Inquiries (http://www.livedepartureboards.co.uk/ldbws/).SOAP Acción WSDL

Pego el WSDL (http://realtime.nationalrail.co.uk/ldbws/wsdl.aspx) en http://soapclient.com/soaptest.html, pero aparece el mensaje de error "No se puede manejar la solicitud sin un parámetro de acción válido. Proporcione una acción válida válida"; ¿Qué demonios debería ser la acción?

Gracias, Stewart

edición:

simplemente utilicé soapclient.com como un ejemplo rápido. En mi software, envío el siguiente XML; Todavía entiendo que me estoy perdiendo una acción.

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

Es muy probable que significa que soapclient.com no le gusta el WSDL, por sus propias razones. El servicio web de NRE funciona bien, sin embargo, lo he usado yo mismo. – skaffman

+0

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

+0

En resumen, busque WSDL para la soapAction. Ver http://stackoverflow.com/questions/128263/how-do-you-determine-a-valid-soapaction – Jono

Respuesta

11

Si es un servicio SOAP 1.1, entonces también tendrá que incluir un campo de encabezado HTTP SOAPAction:

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

+1

Me da tanto ... pero no puedo por la vida de mi trabajo lo que debería estar en el campo SOAPAction. – Stewart

+1

Sería lo mismo que lo que está en su cuerpo SOAP, es decir, GetDepartureBoardRequest o el totalmente calificado: http://thalesgroup.com/RTTI/2008-02-20/ldb/GetDepartureBoardRequest – mythz

+1

Lo he intentado, pero obtener "El servidor no reconoció el valor de SOAPAction del encabezado HTTP: GetDepartureBoardRequest" – Stewart

4

me he encontrado exactamente el mismo problema al intentar escribir un cliente para el servicio de National Rail SOAP con Perl.

El problema se produce porque el módulo de Perl que estoy usando 'SOAP :: Lite' inserta un '#' en la cabecera SOAPAction ...

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

Esto no se interpreta correctamente por .NET servidores. Encontré esto en el ejemplo 3-19 en O'Reilly Programming Web Services with SOAP. La solución se presentó a continuación en la sección 3-20, es decir, debe especificar explícitamente el formato del encabezado con el método '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"; 

Mi conjetura es que soapclient.com está utilizando SOAP :: Lite detrás de las escenas y así están golpeando el mismo problema cuando se habla de National Rail.

La solución es escribir su propio cliente para que tenga control sobre el formato del encabezado SOAPAction ... pero probablemente ya lo haya hecho.

Richard

0

Acabo de pasar un tiempo tratando de conseguir esto para trabajar tienen un escrito un Ruby gem que tiene acceso a la API. Puedes leer más en project page.

Este código está trabajando 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 

la esperanza de que es útil para alguien!

0

Recopilamos servicios web en Windows Server e intentamos conectarnos con PHP en Apache. Tenemos el mismo error. El problema terminó siendo versiones diferentes del cliente de Soap en los diferentes servidores. La coincidencia de las versiones de SOAP en las opciones en ambos servidores resolvió el problema en nuestro caso.

0

el servicio tienen 4 operaciones: 1. GetServiceDetails 2. GetArrivalBoard 3. GetDepartureBoard 4.GetArrivalDepartureBoard

Implementation of web service

0

Cuando soapAction no se encuentra en el SOAP 1.2 solicitud (y muchos clientes no establecen que, incluso cuando se especifica en WSDL), algunos servidores de aplicaciones (por ejemplo. Jboss) inferir la "real" soapAction desde {xsd:import namespace}+{wsdl:operation name}. tanto, para que la inferida "real" soapAction partido de la esperada soapAction, se puede establecer el soapAction espera que {xsd:import namespace}+{wsdl:operation name} en la definición de WS (@WebMethod(action=...) para Java EE)

Ej. para un caso típico de Java EE, esto ayuda (no el caso de la Stewart, National Rail WS tiene conjunto 'soapAction'):

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

Si no puede cambiar el servidor, tendrá que forzar cliente para llenar soapAction .

0

He resuelto este problema, en código Java, añadiendo: se requiere

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