0

他の場所で説明 したように、Ruby 1.8 で使用できた は Ruby 1.9 で削除されました。人々はSavon gemの使用を提案しましたが、特に WSDL が利用できないエンドポイントについて、既存のコードを変換する方法に関するチュートリアルが見つかりません。SOAP::RPC::Driver

たとえば、次のようにSOAP::RPC::Driver記述できます。

require 'soap/rpc/driver'
client = SOAP::RPC::Driver.new 'http://example.com/endpoint', 'MY_NAMESPACE'

メソッドを追加します (私の場合は利用可能な WSDL がないため):

client.add_method 'MyMethod', 'Arg1', 'Arg2'

そして、それらを呼び出します:

response = client.MyMethod arg_one arg_two

Savon でこのようなメソッドを追加する方法がわかりません。

4

1 に答える 1

1

WSDL を使用しない場合は、明示的に設定する必要がありwsdlます (これは少し直感に反すると思いますが、機能します)。

require 'savon'
client = Savon::Client.new do
    wsdl.endpoint = 'http://example.com/endpoint'
    wsdl.namespace = 'MY_NAMESPACE'; 
end

Savon に相当するものはないと思いadd_methodますが、次のようにリクエストできるはずです。

response = client.request 'MyMethod' do
  soap.body = { 'Arg1' => arg_one' }
end

ただし、これを実行すると、次のエラーが発生しました。

Savon::SOAP::Fault: (SOAP-ENV:Client) SOAPAction shall match 'uri#method' if present 

明示的に設定することで、これを回避できましたSOAPAction

response = client.request 'MyMethod', soap_action: '#MyMethod' do ...

最後に、このエラーが発生しました:

Savon::SOAP::Fault: (SOAP-ENV:Client) Denied access to method (MyMethod) in class (main) at /usr/lib/perl5/site_perl/5.8.8/SOAP/Lite.pm line 2128.

wsdl.namespaceこれは、指定されたがリクエストで期待どおりに渡されていないためと思われます。soap_actionと の両方で明示的に設定することで、これを解決できましたxmlns

response = client.request 'MyMethod', soap_action: 'MY_NAMESPACE#MyMethod', xmlns: 'MY_NAMESPACE'
于 2012-07-12T21:42:24.810 に答える