2010-08-10 85 views
4

我正在尝试使用ruby和Savon来使用web服务。用ruby和savon消耗soap服务

测试服务http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2

 
require 'rubygems' 
require 'savon' 

client = Savon::Client.new "http://www.webservicex.net/stockquote.asmx?WSDL" 
client.get_quote do |soap| 
    soap.body = {:symbol => "AAPL"} 
end 

它返回一个SOAP异常。检查肥皂信封,它看起来肥皂请求没有正确的名称空间。

任何人都可以建议我可以做什么使这项工作? 我也有与其他Web服务端点相同的问题。

谢谢,

回答

5

这是萨翁处理名称空间的一个问题。看到此答案Why is "wsdl" namespace interjected into action name when using savon for ruby soap communication?

可以通过具体地调用soap.input并使其阵列解决这个问题,第一个元素是方法和第二是包含命名空间(S)

require 'rubygems' 
require 'savon' 

client = Savon::Client.new "http://www.webservicex.net/stockquote.asmx?WSDL" 
client.get_quote do |soap| 
    soap.input = [ 
    "GetQuote", 
    { "xmlns" => "http://www.webserviceX.NET/" } 
    ] 
    soap.body = {:symbol => "AAPL"} 
end 
1

您的散列可能会发现最新的gem使用方法“request”,然后使用所需方法的符号引用。

require 'rubygems' 
require 'savon' 

client = Savon::Client.new "http://www.webservicex.net/stockquote.asmx?WSDL" 
client.request :get_quote do |soap| 
    soap.input = [ 
    "GetQuote", 
    { "xmlns" => "http://www.webserviceX.NET/" } 
    ] 
    soap.body = {:symbol => "AAPL"} 
end