我正在使用savon 2 gem。如何将xmlns添加到消息标记而不是信封?
xml generate是这个
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tns="http://www.serviceurl.com/">
<soap:Body>
<tns:Search>
<Token>55</Token>
</tns:Search>
</soap:Body>
</soap:Envelope>
我需要这个
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Search xmlns="http://www.serviceurl.com/">
<Token>55</Token>
</Search>
</soap:Body>
</soap:Envelope>
即搜索xmlns =&#34; http://www.serviceurl.com/"
答案 0 :(得分:1)
在XML术语中,这两个请求之间的差异不是Search
元素,而是在“当前”版本中Token
元素不在命名空间中,而在“需要”中版本Token
位于http://www.serviceurl.com/
命名空间中。
您应该可以通过将客户的element_form_default
参数设置为:qualified
Savon.client(element_form_default: :qualified)
(docs)
这可能会产生
<tns:Search>
<tns:Token>
但就XML解析器而言,它等同于具有默认命名空间声明的版本(如果服务不接受此表单,那么错误在于服务,而不是在你的客户)。
答案 1 :(得分:1)
我有一个非常简单的解决方案。 只需使用字符串作为标记并指定名称空间即可。 只是错过了分享你的代码,所以我只能猜测它的样子,但是你应该把它改成这样的东西:
'tns:Token' => 'SS'
答案 2 :(得分:0)
试试这样:
client=Savon.client(wdsl: ...)
client.call(:search, attributes: {xmlns: "http://www.serviceurl.com/"}) do
message ({
"Token" => 55
})
end