我正在尝试使用Savon将请求发送到Web服务。我正在使用的服务需要嵌套的命名空间,我还没有想出如何在请求中提供它们。
我试图手工制作请求(实际上是用nokogiri)并发送生成的xml:
client.call(:some_op, :message=>{:"op"=>"<elem/>"})
但是savon逃脱了弦并发送了<elem/>
如何在不转义的情况下发送原始xml?
调用应该如下所示:
client.call(:some_op, xml: "<elem />")
或者,如果您只想设置一个或多个名称空间,则按如下方式创建客户端(不使用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
)
命名空间是Hash
参数。
看起来Savon内部使用Gyoku Gem将ruby哈希转换为XML,并且根据文档,Gyoku不会转义以感叹号结尾的哈希键:https://github.com/savonrb/gyoku#special-characters
所以这段代码可以将原始XML放入请求中,同时仍然使用Savon生成包络xml:
client.call(:some_op, :message=>{:"op!"=>"<elem/>"})