Анализ SOAP-ответа с использованием метода преобразования SAVON response.to_hash - PullRequest
4 голосов
/ 11 ноября 2010

У меня проблемы с анализом SOAP-ответа.

Вот мой код:

require 'rubygems'
require 'savon'

client = Savon::Client.new "http://1.2.3.4/xyz/abcd/fsds.wsdl"

res = client.query_unpaid_assesments do |soap,wsse|
  soap.namespaces["xmlns:SOAP-ENV"] = "http://schemas.xmlsoap.org/soap/envelope/"
  soap.namespaces["xmlns:xsi"] = "http://www.w3.org/2001/XMLSchema-instance"
  soap.namespaces["xmlns:xsd"] = "http://www.w3.org/2001/XMLSchema"

  wsse.username="xyz"
  wsse.password="123"

  soap.body = {:orderNumber => 111222333 }
end

response = Savon::Response#to_hash
hres = response.to_hash 
all_data = hres[:response][:asses_data][:date][:amount][:assesReference][:year][:cusOffCode][:serie][:number][:date][:time]

Вот ошибка, которую я имею:

неопределенный метод to_hash для Savon :: Response: Class (NoMethodError)

"res" дает мне xml-ответ, который я хотел бы получить в хэше.

Я прочитал предыдущие связанные вопросы, и они рекомендовали использовать response.to_hash, который я сделал и выдает ошибку, указанную выше. Как я могу избавиться от этой ошибки и получить свой ответ в хэш.

спасибо за помощь

Я забыл опубликовать текст ответа xml, который я хотел бы проанализировать:

<soapenv:Body>
<response>
<ns203:assesData xmlns:ns203="http://asdfsd.sdfsd.zbc.org">
<ns203:date>2010-09-01</ns203:date>
<ns203:amount>34400</ns203:amount>
<ns203:asesReference>
    <ns203:year>2010</ns203:year>
    <ns203:cusOffCode>098</ns203:customsOfficeCode>
    <ns203:serie>F</ns203:serie>
    <ns203:number>524332</ns203:number>
    <ns203:date>2010-11-11</ns203:date>
    <ns203:time>10:11:103</ns203:time>
</ns203:assesReference>
</ns203:assesData>
</response>
</soapenv:Body>

Ответы [ 2 ]

3 голосов
/ 14 февраля 2011

Я полагаю, что вам нужно пытаться самому #to_hash res возвращать объект Savon :: Response вместо класса Savon :: Response.

Так что hres = res.to_hash должно работать.

Пример, который я нашел (в конце здесь: http://blog.nofail.de/2010/01/savon-vs-handsoap-calling-a-service/) должен дать вам идею.

class SavonBankCode
  def self.zip_code(bank_code)
    client = Savon::Client.new Shootout.endpoints[:bank_code][:uri]
    response = client.get_bank { |soap| soap.body = { "wsdl:blz" => bank_code } }
    response.to_hash[:get_bank_response][:details][:plz]
  end
end

Альтернативой может быть анализ результата с помощью Nokogiri или подобного, то есть вы можете сделать что-то вроде этого:

require 'nokogiri'
response = res.xpath("//ns203:assesData", "ns203" => "http://asdfsd.sdfsd.zbc.org")
date = response.xpath("ns203:date", "ns203" => "http://asdfsd.sdfsd.zbc.org")
amount = response.xpath("ns203:amount", "ns203" => "http://asdfsd.sdfsd.zbc.org")
number = response.xpath("ns203:asesReference/ns203:number", "ns203" => "http://asdfsd.sdfsd.zbc.org")

и т.д.. и т.д. Безобразно, как грех, конечно, но эй, это (непроверенная или усовершенствованная) альтернатива;)

Удачи!

1 голос
/ 11 марта 2014

Вы также можете попробовать response.body.Возвращает хеш

...