使用soap4r访问SOAP服务无法访问返回对象的内容

时间:2009-10-31 01:44:05

标签: ruby soap wsdl soap4r

所以我需要从我的rails应用程序访问此服务。我正在使用soap4r来读取WSDL并动态生成访问服务的方法。

从我读过的内容来看,我应该能够链接方法来访问嵌套的XML节点,但我无法让它工作。我尝试使用wsdl2ruby命令并阅读生成的代码。据我所知,soap库没有生成这些访问器方法。我对红宝石很新,所以我不知道我是否只是错过了什么?

我知道当我检查元素时,我可以看到我想要的数据。我无法达到目的。

例如,如果我使用以下代码:

require "soap/wsdlDriver"
wsdl = "http://frontdoor.ctn5.org/CablecastWS/CablecastWS.asmx?WSDL"
driver = SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
response = driver.getChannels('nill')
puts response.inspect

我得到以下输出:

ignored element: {http://schemas.xmlsoap.org/wsdl/soap12/}binding
ignored element: {http://schemas.xmlsoap.org/wsdl/soap12/}operation
ignored element: {http://schemas.xmlsoap.org/wsdl/soap12/}body
ignored element: {http://schemas.xmlsoap.org/wsdl/soap12/}address
#<SOAP::Mapping::Object:0x80b96394 {http://www.trms.com/CablecastWS/}GetChannelsResult=#<SOAP::Mapping::Object:0x80b96178 {http://www.trms.com/CablecastWS/}Channel=[#<SOAP::Mapping::Object:0x80b95f5c {http://www.trms.com/CablecastWS/}ChannelID="1" {http://www.trms.com/CablecastWS/}Name="CTN 5">, #<SOAP::Mapping::Object:0x80b9519c {http://www.trms.com/CablecastWS/}ChannelID="2" {http://www.trms.com/CablecastWS/}Name="PPAC 2">, #<SOAP::Mapping::Object:0x80b94620 {http://www.trms.com/CablecastWS/}ChannelID="14" {http://www.trms.com/CablecastWS/}Name="Test Channel">]>>

所以数据绝对存在!

以下是wsdl2ruby为上面使用的方法生成的代码:

# {http://www.trms.com/CablecastWS/}GetChannels
class GetChannels
  def initialize
  end
end

# {http://www.trms.com/CablecastWS/}GetChannelsResponse
#   getChannelsResult - ArrayOfChannel
class GetChannelsResponse
  attr_accessor :getChannelsResult

  def initialize(getChannelsResult = nil)
    @getChannelsResult = getChannelsResult
  end
end

对于这篇长篇文章感到抱歉,我认为越多的信息越有可能让某人指出我正确的方向。

由于

射线

1 个答案:

答案 0 :(得分:4)

<强>答案

require "soap/wsdlDriver"
wsdl = "http://frontdoor.ctn5.org/CablecastWS/CablecastWS.asmx?WSDL"
driver = SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
response = driver.getChannels('nill')

for item in response.getChannelsResult.channel
  puts item.name
  puts item.channelID
end

我是如何得到答案的

您可以通过

找出回应方法
response.methods

这将为您提供一长串难以排序的方法,因此我想减去通用方法。 Ruby允许你减去数组。

response.methods - Object.new.methods

使用这种技术,我找到了响应的getChannelsResult方法。我重复了这个过程

resonse.getChannelsResult.methods - Object.new.methods

我找到了结果的通道方法。再次!

response.getChannelsResult.channel.methods - Object.new.methods

这返回了一堆方法,包括:sort,min,max等。所以我猜到了Array。一个简单的确认是按顺序

response.getChannelsResult.channel.class

果然它返回了Array。为了简化生活,我只使用数组的第一项来获取其方法

response.getChannelsResult.channel.first.methods - Object.new.methods

Whoalla,我发现了另外两种方法“name”和“channelID”