Savon + Rails 2 Как изменить структуру запросов XML - PullRequest
2 голосов
/ 21 июня 2011

Я использую Savon для разработки клиента веб-сервиса.Поскольку я новичок, я решил сначала попробовать пример WDSL, который в моем случае:

http://www.webservicex.com/CurrencyConvertor.asmx?wsdl

Мой контроллер очень прост:

require 'savon'

class WebServiceController < ApplicationController  
  def index
    puts "web_service: IN"    
    client = Savon::Client.new do
      wsdl.document = "http://www.webservicex.com/CurrencyConvertor.asmx?wsdl"
    end

    response = client.request :conversion_rate do
      soap.body = {
        :from_currency => 'USD',
        :to_currency => 'EUR'
      }
    end    
    puts response.to_hash;    
    render :text => response.to_hash    
  end
end

XML, созданный этим кодом:

<env:Envelope   xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xmlns:wsdl="http://www.webserviceX.NET/" 
                xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
    <env:Body>
        <ConversionRate>
            <wsdl:fromCurrency>USD</wsdl:fromCurrency>
            <wsdl:toCurrency>EUR</wsdl:toCurrency>
        </ConversionRate>
    </env:Body>
</env:Envelope>

Однако XML должен быть (и я знаю это, потому что я использую soapUI):

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                    xmlns:web="http://www.webserviceX.NET/">
<soapenv:Header/>
   <soapenv:Body>
      <web:ConversionRate>
         <web:FromCurrency>USD</web:FromCurrency>
         <web:ToCurrency>EUR</web:ToCurrency>
      </web:ConversionRate>
   </soapenv:Body>
</soapenv:Envelope>

Я знаю, что мой запрос XML не работает, потому что я всегда получаю «0» (ноль) в качестве ответа, и с «правильным» запросом XML, сгенерированным soapUI, я получаю правильные значения (такие как'0,6959' ...).

Что-то не хватает в моем коде?

Спасибо !!!

1 Ответ

1 голос
/ 23 июня 2011

две вещи:

  1. вам нужно добавить: wsdl к звонку
  2. вам нужно убедиться, что теги написаны правильно

изменить на

response = client.request :wsdl, :conversion_rate do

и

"FromCurrency" => 'USD',
"ToCurrency" => 'EUR'

это должно сделать это для вас.

...