Sending raw XML using Savon 2

爷,独闯天下 提交于 2019-11-28 04:04:39

问题


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?


回答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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!