Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generate XML dynamically and post it to a web service in Rails

I am currently developing a Rails app in which I need to dynamically send XML request to an external web service. I've never done this before and I a bit lost.

More precisely I need to send requests to my logistic partner when the status of an order is updated. For instance when an order is confirmed I need to send data such as the customer's address, the pickup address, etc...

I intended to use the XML builder to dynamically generate the request and Net:HTTP or HTTParty to post the request, based on this example.

Is that the right way to do so? How can I generate the XML request outside the controller and then use it in HTTParty or Net:HTTP?

Thanks for your help,

Clem

like image 339
ClemDoum Avatar asked Jul 30 '13 16:07

ClemDoum


1 Answers

That method will work just fine.

As for how to get the XML where you need it, just pass it around like any other data. You can use the Builder representation, which will automatically convert to a String as appropriate, or you can pass around a stringified (to_s) version of the Builder object.

If, for example, it makes sense for your model (which we'll call OrderStatus) to generate the XML, and for your controller to post the request:

# 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

You may want to wrap the HTTP calls in a begin/rescue/end block and do something with the response, but otherwise it's all pretty straightforward and simple.

Make XML with Builder, then send it down the wire.

In your case it sounds like you may need to send several different requests as the order evolves; in that case:

  1. Plan out what your possible order states are.
  2. Determine what data needs to be sent for each state.
  3. Decide how to represent that state within your models, so you can send the appropriate request when the state changes.

Where my example uses one method to generate XML, maybe you'll want 5 methods to handle 5 possible order states.

like image 178
colinm Avatar answered Nov 18 '22 15:11

colinm