【问题标题】:How do I move from SOAP:RPC:Driver to Savon如何从 SOAP:RPC:Driver 转移到 Savon
【发布时间】:2012-07-12 21:42:24
【问题描述】:

作为discussedelsewhere,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 添加这样的方法。

【问题讨论】:

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


    【解决方案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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多