如何在savon中添加xmlns到消息

时间:2014-05-07 08:28:44

标签: soap savon

我正在使用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/"

3 个答案:

答案 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