Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sending raw XML using Savon 2

Tags:

soap

xml

ruby

savon

I'm trying to use Savon to send requests to a webservice. The service I'm consuming requires nested namespaces, and I haven't figured out yet how to provide them on a request.

I've tried to craft the request by hand (with nokogiri, actually) and send the resulting xml:

client.call(:some_op, :message=>{:"op"=>"<elem/>"})

But savon escapes the string and sends &lt;elem/&gt;

How can I send raw xml without escaping?

like image 228
loopbackbee Avatar asked Feb 20 '14 16:02

loopbackbee


2 Answers

The call should look like this:

client.call(:some_op, xml: "<elem />")

Or if you just want to set one or multiple namespaces then create a client as follows (without WSDL):

client = Savon.client(
  :endpoint => 'http://www.example.com',
  :namespace => 'urn:core.example.com',
  :namespaces => { 'ns1' => 'http://v1.example.com',
                   'ns2' => 'http://v2.example.com' },
  :log => true,
  :log_level => :debug,
  :pretty_print_xml => true
)

The namespaces are a Hash parameter.

like image 177
Steffen Roller Avatar answered Oct 17 '22 10:10

Steffen Roller


It looks like Savon internally uses the Gyoku Gem to convert ruby hashes to XML, and Gyoku will not escape hash keys ending with exclamation marks according to the documentation: https://github.com/savonrb/gyoku#special-characters

So this code works to get raw XML into the request while still using Savon to generate the envelope xml:

client.call(:some_op, :message=>{:"op!"=>"<elem/>"})

like image 21
adailey Avatar answered Oct 17 '22 12:10

adailey