我正在尝试为国家铁路查询的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>
答案 0 :(得分:16)
如果是SOAP 1.1服务,那么您还需要包含SOAPAction HTTP头字段:
答案 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)
答案 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);