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

时间:2015-10-02 01:32:06

标签: ruby api soap soap-client savon

我目前正在使用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的了解并不足以使它与嵌套元素一起工作。

1 个答案:

答案 0 :(得分: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,因此如果您的请求是caseSensitive,请使用字符串而不是符号。