问题
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 <elem/>
How can I send raw xml without escaping?
回答1:
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.
回答2:
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/>"})
来源:https://stackoverflow.com/questions/21913449/sending-raw-xml-using-savon-2