【问题标题】:Sending raw XML using Savon 2使用 Savon 2 发送原始 XML
【发布时间】:2014-02-20 16:15:34
【问题描述】:

我正在尝试使用 Savon 向网络服务发送请求。我正在使用的服务需要嵌套命名空间,我还没有弄清楚如何根据请求提供它们。

我尝试手工制作请求(实际上是使用 nokogiri)并发送生成的 xml:

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

但 savon 转义字符串并发送&amp;lt;elem/&amp;gt;

如何在不转义的情况下发送原始 xml?

【问题讨论】:

    标签: ruby xml soap savon


    【解决方案1】:

    调用应该如下所示:

    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 参数。

    【讨论】:

    • 这可行,但去掉了所有的 SOAP 结构:&lt;Envelope&gt;&lt;Body&gt;&lt;SomeOp&gt;...。有办法保留吗?
    • 恐怕你不能同时拥有它:-)。究竟是什么问题阻碍了您使用 Savon 标准方法?如果需要,有一些方法可以注入额外的命名空间。
    • 基本上,我有两个不同的命名空间,一个用于操作 (tns),另一个用于消息内的所有字段 (a)。我已经设法在客户端上使用 :strip_namespaces=&gt;false 的响应中保留消息命名空间,但我无法弄清楚如何在请求中发送命名空间定义 - request locals documentation 似乎没有提到命名空间选项跨度>
    • 理想情况下,我根本不想处理哈希上的命名空间,让 Savon 从 WSDL 处理它,但我不确定这是否可能......
    • 我编辑了我的答案。您可能想稍微改变一下您的问题:-)。希望对您有所帮助。
    【解决方案2】:

    看起来 Savon 内部使用 Gyoku Gem 将 ruby​​ 哈希转换为 XML,根据文档,Gyoku 不会转义以感叹号结尾的哈希键:https://github.com/savonrb/gyoku#special-characters

    因此,这段代码可以将原始 XML 放入请求中,同时仍使用 Savon 生成信封 xml:

    client.call(:some_op, :message=&gt;{:"op!"=&gt;"&lt;elem/&gt;"})

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      相关资源
      最近更新 更多