SOAP Action WSDL

时间:2010-02-14 21:08:23

标签: soap wsdl action

我正在尝试为国家铁路查询的SOAP服务(http://www.livedepartureboards.co.uk/ldbws/)实施客户端。

我将WSDL(http://realtime.nationalrail.co.uk/ldbws/wsdl.aspx)粘贴到http://soapclient.com/soaptest.html中,但是我收到错误消息“无法处理没有有效操作参数的请求。请提供有效的soap操作。”;究竟应该采取什么行动?

谢谢, 斯图尔特

编辑:

我刚用soapclient.com作为一个简单的例子。在我的软件中,我发送以下XML;我仍然觉得我错过了一个动作。

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

8 个答案:

答案 0 :(得分:16)

如果是SOAP 1.1服务,那么您还需要包含SOAPAction HTTP头字段:

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

答案 1 :(得分:4)

在尝试使用Perl为National Rail SOAP服务编写客户端时,我遇到了完全相同的问题。

问题是由于我正在使用'SOAP :: Lite'的Perl模块在SOAPAction头中插入'#'...

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

.NET服务器无法正确解释这一点。我在O'Reilly的 Programming Web Services with SOAP 中从例3-19中找到了这个。解决方案在下面的第3-20节中给出,即您需要使用'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";

我的猜测是soapclient.com在幕后使用SOAP :: Lite,因此在与National Rail交谈时遇到了同样的问题。

解决方案是编写自己的客户端,以便您可以控制SOAPAction标头的格式......但您可能已经完成了。

理查德

答案 2 :(得分:1)

SOAP 1.1中需要SOAPAction,但可以为空(&#34;&#34;)。

请参阅https://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383528

&#34;空字符串的头字段值(&#34;&#34;)表示SOAP消息的意图由HTTP Request-URI提供。&#34;

尝试设置SOAPAction =&#34;&#34;

答案 3 :(得分:0)

我花了一些时间试图让这个工作得到一个写Ruby gem来访问API。您可以在project page上阅读更多内容。

这是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

希望对某人有帮助!

答案 4 :(得分:0)

我们在Windows Server上整合了Web服务,并尝试在Apache上与PHP连接。我们得到了同样的错误。该问题最终成为不同服务器上不同版本的Soap客户端。在两个服务器上的选项中匹配SOAP版本解决了我们的问题。

答案 5 :(得分:0)

该服务有4个操作: 1. GetServiceDetails 2. GetArrivalBoard 3. GetDepartureBoard 4. GetArrivalDepartureBoard

Implementation of web service

答案 6 :(得分:0)

当SOAP 1.2请求中缺少soapAction时(许多客户端没有设置它,即使在WSDL中指定它),一些应用服务器(例如jboss)推断出“实际”{{1来自soapAction。 因此,要使推断的“实际”{xsd:import namespace}+{wsdl:operation name}与预期的soapAction匹配,您可以在WS EE定义(soapAction)中为Java EE设置预期的soapAction为{xsd:import namespace}+{wsdl:operation name}

EG。对于一个典型的Java EE案例,这有帮助(不是斯图尔特的情况,National Rail WS有'soapAction'设置):

@WebMethod(action=...

如果您无法更改服务器,则必须强制客户填写@WebMethod(action = "http://packagename.of.your.webservice.class.com/methodName")

答案 7 :(得分:0)

我已经在Java Code中解决了这个问题,添加:

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