如何从SOAP:RPC:Driver迁移到Savon

时间:2012-07-12 21:42:24

标签: ruby soap rpc ruby-1.9 ruby-1.8

作为discussed elsewhere,Ruby 1.8中提供的SOAP::RPC::Driver已在Ruby 1.9中删除。人suggested使用Savon gem,但我找不到有关如何转换现有代码的任何教程,特别是对于没有WSDL可用的端点。

例如,使用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添加这样的方法。

1 个答案:

答案 0 :(得分:1)

not using a 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_actionxmlns中明确设置来解决此问题:

response = client.request 'MyMethod', soap_action: 'MY_NAMESPACE#MyMethod', xmlns: 'MY_NAMESPACE'