2013-07-30 2 views
5

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

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

Я намеревался использовать построитель XML для динамического генерации запроса и Net: HTTP или HTTParty для публикации запрос, основанный на this example.

Это правильный способ сделать это? Как я могу сгенерировать XML-запрос за пределами контроллера, а затем использовать его в HTTParty или Net: HTTP?

Спасибо за вашу помощь,

Клем

ответ

6

Этот метод будет работать нормально.

Как получить XML, где он вам нужен, просто передайте его, как и любые другие данные. Вы можете использовать представление Builder, которое будет автоматически конвертировать в String, если необходимо, или вы можете передать стробированную (to_s) версию объекта Builder.

Если, например, это имеет смысл для вашей модели (которую мы будем называть OrderStatus) для создания XML, и для вашего контроллера, чтобы отправить запрос:

# Model (order_status.rb) 
def to_xml 
    xml = Builder::XmlMarkup.new 
    ... # Your code here 
    xml 
end 

 

# Controller (order_statuses_controller.rb) 
def some_method 
    @order_status = OrderStatus.find(:some_criteria) 
    ... # Your code here 
    http = Net::HTTP.new("www.thewebservicedomain.com") 
    response = http.post("/some/path/here", @order_status.to_xml) 
end 

Возможно, вы захотите обернуть HTTP-вызовы блоком begin/rescue/end и сделать что-то с ответом, но в остальном все это довольно просто и просто.

Сделайте XML с Builder, затем отправьте его по кабелю.

В вашем случае это звучит так, как будто вам может потребоваться отправить несколько разных запросов по мере развития заказа; в этом случае:

  1. Планируйте, каковы ваши возможные состояния заказа.
  2. Определите, какие данные необходимо отправлять для каждого состояния.
  3. Решите, как представить это состояние в ваших моделях, чтобы вы могли отправить соответствующий запрос при изменении состояния.

Где мой пример использует один метод для генерации XML, возможно, вам понадобится 5 методов для обработки 5 возможных состояний порядка.

+0

Большое спасибо за ваш ответ colinm и за подробные сведения о том, как сгенерировать XML! Действительно, мне нужно будет отправить несколько разных запросов для разных состояний (представленных в государственной машине), но я думаю, что смогу справиться с этим сейчас! – ClemDoum