2010-11-11 3 views
4

У меня возникла проблема с анализом ответа SOAP.Анализ SOAP-ответа с использованием метода SAVON response.to_hash

Вот мой код:

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: Класс (NoMethodError)

"Рез" является давая мне 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> 

ответ

3

Я считаю, что вам нужно пытаться #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") 

и т.д. и т.п. Уродливый, как грех, конечно, но эй это (непроверенная или уточненная);)

Удачи!

0

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

Смежные вопросы