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

我不相信add_method在 Savon 中存在等价物,但是您应该可以这样提出请求:

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 回答