Savon - 为每个元素添加命名空间的快捷方式? (肥皂)

Savon - shortcut for prepending every element with namespace? (SOAP)

我目前正在使用 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

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

我认为这就是您所需要的,所以您想在请求中添加一个命名空间 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,因此如果您的请求区分大小写,请使用字符串而不是符号。