Доступ к службе SOAP с помощью soap4r не может получить доступ к содержимому возвращаемых объектов - PullRequest
1 голос
/ 31 октября 2009

Так что мне нужно получить доступ к этой службе из моего приложения rails. Я использую soap4r для чтения WSDL и динамического создания методов для доступа к сервису.

Из того, что я прочитал, я должен быть в состоянии связать методы для доступа к вложенным узлам XML, но я не могу заставить его работать. Я попытался с помощью команды wsdl2ruby и прочитал сгенерированный код. Из того, что я могу сказать, библиотека мыла не генерирует эти методы доступа. Я довольно новичок в рубине, так что я не знаю, просто что-то упустил?

Я знаю, что когда я проверяю элемент, я вижу нужные данные. Я просто не могу добраться до этого.

Например, если я использую следующий код:

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

Извините за длинный пост, я подумал, что чем больше информации, тем более вероятно, что кто-то может указать мне в правильном направлении.

Спасибо

1022 * -ray *

1 Ответ

4 голосов
/ 31 октября 2009

Ответ

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

Конечно, он вернул массив. Чтобы упростить жизнь, я просто поработал с первым элементом массива, чтобы получить его методы

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

Ух ты, я нашел еще два метода "name" и "channelID"

...