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,因此如果您的请求区分大小写,请使用字符串而不是符号。
我目前正在使用 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,因此如果您的请求区分大小写,请使用字符串而不是符号。