Savon.rb and sequences

As I wrote in my last post, I’ve recently learned it is important to be able to show what you’ve been doing. So I’m trying to increase the posts on a number of small problems I find in my daily job, and in my hobby projects. This one appeared in my daily job.

I was developing a small interface between two applications via a SOAP web service. Actually, we are using Redmine for development, and Remedy for the whole organization, and we didn’t want to fill the information twice.

I was using Savon.rb for creating a client in Redmine that would invoke a SOAP web service in Remedy. The code was something like this:

response=client.request “Resolver” do soap.header={:AuthenticationInfo=>{ :userName=>ws_user, :password=>ws_pwd, } soap.body = { “Status”=>“Resolved”, “Resolution”=> message , “Status_Reason”=>“Client Action Required”, “Incident_Number”=>code, “Status_Reason2”=>“Client Action Required”, “AssigneeLoginID”=>user, } end

However, I was getting a SOAP error

ARERR [8962] Unexpected element encountered in the input XML document
The problem lies in [Ruby hashes not preserving the order and Savon sending XML sequences in incorrect order]( I just updated the call to something like this

response=client.request “Resolver” do soap.header={:AuthenticationInfo=>{ :userName=>ws_user, :password=>ws_pwd, :order! => [:userName, :password]} } soap.body = { “Status”=>“Resolved”, “Resolution”=>message, “Status_Reason”=>“Client Action Required”, “Incident_Number”=>code, “Status_Reason2”=>“Client Action Required”, “AssigneeLoginID”=>user, :order! => [“Status”, “Resolution”, “Status_Reason”,“Incident_Number”, “Status_Reason2”, “AssigneeLoginID”] } end

and it solved the issue. I expected Savon to take care of this, but anyway, I understand this is solved in Ruby 1.9x.

First published here