web-dev-qa-db-ja.com

SOAP Action WSDL

National Rail Enquiries 'SOAP Service( http://www.livedepartureboards.co.uk/ldbws/ )のクライアントを実装しようとしています。

WSDL( http://realtime.nationalrail.co.uk/ldbws/wsdl.aspx )を http://soapclient.com/soaptest.html に貼り付けますしかし、「有効なアクションパラメータなしでリクエストを処理できません。有効な石鹸アクションを指定してください。」というエラーメッセージが返されます。一体何をすべきでしょうか?

ありがとう、スチュワート

編集:

簡単な例として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>
16
Stewart

そのSOAP 1.1サービスの場合、SOAPAction HTTPヘッダーフィールドも含める必要があります。

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

18
mythz

National Rail SOAPサービスとPerlのクライアントを作成しようとすると、まったく同じ問題に遭遇しました。

この問題は、「SOAP :: Lite」を使用しているPerlモジュールがSOAPActionヘッダーに「#」を挿入するために発生しました...

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

これは、.NETサーバーによって正しく解釈されません。これはO'Reilly'sSOAPを使用したWebサービスのプログラミングの例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ヘッダーの形式を制御できるように独自のクライアントを作成することですが、おそらくすでにそれを行っているはずです。

リチャード

4

SOAPActionはSOAP 1.1では必須ですが、空( "")でもかまいません。

https://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383528 を参照してください

「空の文字列( "")のヘッダーフィールド値は、SOAPメッセージの意図がHTTP Request-URIによって提供されることを意味します。 "

SOAPAction = ""を設定してみてください

2
andre.wiik

soapActionがSOAP 1.2リクエストで欠落している場合(および多くのクライアントは、WSDLで指定されている場合でも、それを設定しません)、一部のアプリサーバー(jbossなど) {xsd:import namespace}+{wsdl:operation name}からの「実際の」soapAction。したがって、推測された「実際の」soapActionを予想されるsoapActionと一致させるために、WS定義で予想されるsoapActionを{xsd:import namespace}+{wsdl:operation name}に設定できます。 (@WebMethod(action=...)for Java EE)

例えば。典型的なJava EEの場合、これは役立ちます(スチュワートの場合ではなく、National Rail WSには 'soapAction'が設定されています):

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

サーバーを変更できない場合は、クライアントにsoapActionを強制的に入力させる必要があります。

0

APIにアクセスする Ruby gem を作成して、これを機能させるために少し時間を費やしました。 プロジェクトページ で詳細を読むことができます。

これは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

それが誰かに役立つことを願っています!

0
iHiD

サービスには4つの操作があります。1. GetServiceDetails 2. GetArrivalBoard 3. GetDepartureBoard 4. GetArrivalDepartureBoard

Implementation of web service

0
antonio

Javaコード、追加:

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

Windows ServerでWebサービスを作成し、ApacheでPHPと接続しようとしました。同じエラーが発生しました。この問題は、異なるサーバー上の異なるバージョンのSoapクライアントでした。 SOAP両方のサーバーのオプションのバージョンは、この場合の問題を解決しました。

0
jessier3