2013-07-30 25 views
5

Obecnie tworzę aplikację Rails, w której muszę dynamicznie wysyłać żądanie XML do zewnętrznej usługi internetowej. Nigdy wcześniej tego nie robiłem i byłem trochę zagubiony.Generowanie XML dynamicznie i umieszczanie go w usłudze sieciowej w Railsach

Dokładniej, muszę wysyłać żądania do mojego partnera logistycznego, gdy status zamówienia zostanie zaktualizowany. Na przykład, gdy zamówienie zostanie potwierdzone, muszę wysłać dane, takie jak adres klienta, adres odbioru itp.

Zamierzałem użyć konstruktora XML do dynamicznego generowania żądania, a Net: HTTP lub HTTParty do opublikowania żądanie, oparte na this example.

Czy to właściwy sposób? Jak mogę wygenerować żądanie XML poza kontrolerem, a następnie użyć go w HTTParty lub Net: HTTP?

Dzięki za pomoc,

Clem

Odpowiedz

6

Ta metoda będzie działać dobrze.

Informacje o tym, jak zdobyć XML tam, gdzie go potrzebujesz, po prostu przekazuj go jak inne dane. Możesz użyć reprezentacji Builder, która automatycznie przekształci się w ciąg znaków, lub możesz ominąć usztywnioną (to_s) wersję obiektu Builder.

Jeśli, na przykład, ma sens dla danego modelu (które będziemy nazywać OrderStatus) do generowania pliku XML, a na kontrolerze odpowiedzieć na żądanie:

# 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 

Możesz ominąć wywołania HTTP w bloku begin/rescue/ i zrobić coś z odpowiedzią, ale poza tym wszystko jest całkiem proste i proste.

Utwórz XML za pomocą Buildera, a następnie wyślij go w dół.

W twoim przypadku może się zdarzyć, że będziesz musiał wysyłać kilka różnych zamówień w miarę rozwoju zamówienia; w takim przypadku:

  1. Zaplanuj, jakie są możliwe stany zamówienia.
  2. Określić, jakie dane należy wysłać dla każdego stanu.
  3. Zdecyduj, jak reprezentować ten stan w modelach, aby można było wysłać odpowiednie żądanie po zmianie stanu.

Gdzie mój przykład wykorzystuje jedną metodę generowania XML, być może będziesz chciał 5 metod obsługi 5 możliwych stanów zamówień.

+0

Wielkie dzięki za odpowiedź colinm i za udzielenie informacji o tym, jak wygenerować XML! Rzeczywiście, będę musiał wysłać kilka różnych żądań dla różnych stanów (reprezentowanych przez automat stanowy), ale myślę, że poradzę sobie z tym teraz! – ClemDoum

Powiązane problemy