使用Ruby Savon客户端连接到PHP NuSOAP服务器

时间:2016-04-21 13:34:56

标签: ruby soap savon

我尝试连接到已使用PHP NuSoap库设置的远程SOAP服务。我使用Ruby Savon客户端进行连接。

访问服务的WDSL地址(http://example.com/api/webservice.php?wdsl)会提供有关我尝试使用的终点的以下信息:

LINQ

像这样设置我的Savon客户端:

   Name: addsubscription
   Binding: webserviceBinding
   Endpoint: http://www.example.com/api/webservice.php
   SoapAction: http://www.example.com/api/webservice.php/addsubscription
   Style: rpc
   Input:
     use: encoded
     namespace:
     encodingStyle: http://schemas.xmlsoap.org/soap/encoding/
     message: addsubscriptionRequest
     parts:
   Output:
     use: encoded
     namespace:
     encodingStyle: http://schemas.xmlsoap.org/soap/encoding/
     message: addsubscriptionResponse
     parts:
   Namespace:
   Transport: http://schemas.xmlsoap.org/soap/http
   Documentation:

然后尝试拨打'添加订阅'方法:

client = Savon::Client.new(wsdl: "http://www.example.com/api/webservice.php?wdsl")

在日志中给出以下错误 -

response = client.call(:addsubscription) do
  message my_hash_of_stuff
end

像这样设置客户端:

Savon::UnknownOperationError: Unable to find SOAP operation: :addsubscription
Operations provided by your service: []

然后运行与上面相同的调用会引发 Savon :: SOAPFault 错误,我假设这是由于缺少名称空间属性(我不确定如何从此错误中进一步调试/收集信息)?

根据以上信息,我应该如何配置Savon客户端连接到此服务?

修改:

像这样设置客户端 -

client = Savon.client do
  endpoint "http://www.example.com/api/webservice.php"
  namespace ''
end

然后调用(使用填充的message_hash var)

client = Savon.client(namespace: '', endpoint: 'http://www.example.com/api/webservice.php')

吐出以下错误:

response = client.call(:addsubscription,
                     message: message_hash)

1 个答案:

答案 0 :(得分:0)

看起来你正在使用过时的Savon版本< 2.x版本我建议升级到2.x版(我写的是2.11.1)。随着v2的引入,界面发生了很大的变化。

最小的实现可能如下所示:

require 'savon'

WSDL = 'http://www.example.com/api/webservice.php?wdsl'

client = Savon.client(wsdl: WSDL,
                      log: true,
                      log_level: :debug,
                      pretty_print_xml: true)
response = client.call(:addsubscription,
                        message: my_hash_of_stuff)
print response.to_hash