SOAP操作WSDL

SOAP操作WSDL,soap,wsdl,action,Soap,Wsdl,Action,我正在尝试为国家铁路查询的SOAP服务()实现一个客户端 我将WSDL()插入,但返回错误消息“如果没有有效的操作参数,则无法处理请求。请提供有效的soap操作。”;行动到底应该是什么 谢谢, 斯图尔特 编辑: 我只是用soapclient.com作为一个简单的例子。在我的软件中,我发送以下XML;我还是觉得我错过了一个动作 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <SOAP-ENV:Envelope xml

我正在尝试为国家铁路查询的SOAP服务()实现一个客户端

我将WSDL()插入,但返回错误消息“如果没有有效的操作参数,则无法处理请求。请提供有效的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>

5.
沃特
GLD
到
0

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


我在尝试使用Perl为国家铁路SOAP服务编写客户端时遇到了完全相同的问题

导致此问题的原因是我使用的Perl模块“SOAP::Lite”在SOAPAction头中插入了“#”

SOAPAction: "http://thalesgroup.com/RTTI/2008-02-20/ldb/#GetDepartureBoard"
.NET服务器无法正确解释这一点。我从O'Reilly的例子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,因此在与国家铁路公司交谈时遇到了同样的问题


解决方案是编写您自己的客户端,这样您就可以控制SOAPAction头的格式。。。但您可能已经这样做了。

我刚刚花了一段时间试图让它工作,并编写了一个访问API的a。你可以阅读更多关于它的文章

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

希望这对某人有帮助

我们在Windows Server上整合了Web服务,并试图在Apache上与PHP连接。我们也犯了同样的错误。问题最终是不同服务器上的Soap客户端版本不同。在两台服务器的选项中匹配SOAP版本解决了我们的问题。

该服务有4个操作: 1.GetServiceDetails 2.到达板 3.GetDepartureBoard 4.GetArrivalDeparterBoard


当SOAP1.2请求中缺少
soapAction
时(而且许多客户端没有设置它,即使它是在WSDL中指定的),一些应用程序服务器(例如jboss)从
{xsd:import namespace}+{WSDL:operation name}
推断出“实际的”
soapAction
。 因此,要使推断的“实际”soapAction与预期的soapAction匹配,您可以在WS定义中将预期的soapAction设置为
{xsd:import namespace}+{wsdl:operation name}
@WebMethod(action=…
)(对于Java EE)

例如,对于一个典型的JavaEE案例,这很有帮助(不是Stewart的案例,National Rail WS设置了“soapAction”):

@WebMethod(操作=”http://packagename.of.your.webservice.class.com/methodName“”


如果无法更改服务器,则必须强制客户端填写
soapAction

我已经用Java代码解决了这个问题,添加了:

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

SOAPAction在SOAP1.1中是必需的,但可以为空(“”)

“空字符串(”“)的头字段值表示SOAP消息的意图由HTTP请求URI提供。”


尝试设置SOAPAction=“”

这很可能意味着soapclient.com不喜欢WSDL,因为它本身的原因。NREWeb服务工作得很好,不过我自己也使用过它。看,我得到了那么多。。。但我一辈子都无法计算出SOAPAction字段中应该包含什么。它将与SOAP正文中的内容相同,即GetDepartureBoardRequest或完全限定的内容:我已经尝试过了,但我得到了“服务器未识别HTTP标头SOAPAction:GetDepartureBoardRequest的值”您是否尝试过使用包含名称空间的完全限定名?它应该与SOAPActionWhat is endpointURL的WSDL值相匹配?它可以是本地主机URL吗?