【问题标题】:Savon - shortcut for prepending every element with namespace? (SOAP)Savon - 为每个元素添加命名空间的快捷方式? (肥皂)
【发布时间】:2015-10-02 01:32:05
【问题描述】:

我目前正在使用 Savon 在 Ruby 中构建一个 SOAP 客户端,但是当我编写生成 XML 的代码时,我不得不编写:

builder = Builder::XmlMarkup.new
builder.ns :request do
    builder.ns :Foo do
        builder.ns :FooBar do
            builder.ns :Bar, "Foo"
        end
    end
end

生成

<ns:request>
<ns:Foo>
<ns:FooBar>
<ns:Bar>Foo</ns:Bar>
</ns:FooBar>
</ns:Foo>
</ns:request>

这显然是非常重复的,如果可能的话,我想删除 NS 重复。我还注意到,如果没有 ns,我可以使用大括号,而不是 dos/ends。

有没有办法解决这个问题?我不喜欢没有使用大括号的能力,当我稍后添加元素名称的动态输入时,它可能会使事情变得复杂。

我试过了

def send_builder(requestsym, data=nil)
@@builder requestsym, data
end

但我对块/procs/lambdas 的了解还不足以使其与嵌套元素一起使用。

【问题讨论】:

  • 请告诉我,您正在尝试构建您的请求的 XML 对吗?

标签: ruby api soap soap-client savon


【解决方案1】:

我认为这是你需要的,所以你想在你的请求 xml 中添加一个命名空间对吗?:

使用 Savon,您可以将命名空间添加到您的 xml 请求中,如下所示

client = Savon.client do
   wsdl: "http://www.webserviceurl.net/service.asmx?WSDL"
   namespace_identifier: :ns
end
response = client.call(:yourOperationHere, message: { request: { foo: { foo_bar: { bar: "Foo" } } } })

结果将是(您的请求正文):

<ns:request>
  <ns:foo>
    <ns:fooBar>
      <ns:bar>
        Foo
      </ns:bar>
    </ns:fooBar>
  </ns:foo>
</ns:request>

请注意,Savon 有一个叫做 Gyoku 的东西,它将符号转换为 :camelcase,因此如果您的请求区分大小写,请使用字符串而不是符号。

【讨论】:

  • 嗨,听起来不错,但我不确定我是否搞砸了。当我尝试该代码时,我得到NoMethodError: undefined method 'request' for #&lt;Savon::Client:0x007f3e82fb8840&gt; from (pry):1:in '&lt;main&gt;'
  • 您的客户似乎有问题,当您执行client.wsdl.soap_actions 时会发生什么?确保您请求的 url 正确,我在答案中给您的 url 只是一个示例
  • 嗨,我得到 NoMethodError: undefined method `wsdl' for #<:client:0x007fbaa0224590 wsdl: href="http://savonrb.com/version2.html" rel="nofollow" target="_blank">savonrb.com/version2.html
  • 你可能是对的,我更新了我的答案再看看。但首先尝试您的请求,如果他们正在使用soapui.org/about-soapui/what-is-soapui-.html
  • 这是我找到的与 SAVON 命名空间相关的最佳答案,谢谢!
猜你喜欢
  • 2013-03-02
  • 2019-10-01
  • 1970-01-01
  • 2011-03-20
  • 2014-11-20
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多