Ruby 使用savon的SOAP消息标记名中的大小写问题

Ruby 使用savon的SOAP消息标记名中的大小写问题,ruby,xml,soap,wsdl,savon,Ruby,Xml,Soap,Wsdl,Savon,我在Windows7 Professional 64位上使用Ruby1.9.2和Savon0.9.2 我需要调用需要从第二个web SOAP服务获取安全令牌的web SOAP服务。我使用的代码如下: require 'savon' client = Savon::Client.new "http://some.url?wsdl" client.wsdl.soap_actions start_session_response = client.request :start_session do

我在Windows7 Professional 64位上使用Ruby1.9.2和Savon0.9.2

我需要调用需要从第二个web SOAP服务获取安全令牌的web SOAP服务。我使用的代码如下:

require 'savon'

client = Savon::Client.new "http://some.url?wsdl"
client.wsdl.soap_actions

start_session_response = client.request :start_session do
  soap.input = ["StartSession", {:xmlns => "http://some.schema" } ]
  soap.body = { :userName => "User", :password => "password" }
end

do_something_response = client.request :do_something do
  soap.input = [ "DoSomething", { :xmlns => "http://some.schema"} ]
  soap.body = { :securityToken => start_session_response.to_hash[:start_session_response][:security_token] }
end
这将生成如下所示的XML:

<?xml version="1.0" encoding="utf-8"?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:wsdl="http://some.schema"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Body>
    <DoSomething xmlns="http://some.schema">
      <wsdl:securityToken>
        <wsdl:tokenType>sessiontoken</wsdl:tokenType>
        <wsdl:token>
         .
        .
        .
        </wsdl:token>
      </wsdl:securityToken>
    </DoSomething>
  </env:Body>
</env:Envelope>

sessiontoken
.
.
.
不要介意这个XML中奇怪的名称空间约定(或者这只是我一个人的约定),savon正在做它的事情

我面临的问题是securitytoken标记中的标记都以小写字母开头,它们应该是大写字母。所以
应该是

在我看来,这些标记的定义都在用于创建savon客户机的WSDL中。这一定义似乎没有被使用或使用不当


如何从savon获取正确的XML/SOAP消息?

savon使用Gyoku转换我相信的标记。要更改符号转换,可以插入以下语句:

Gyoku.convert_symbols_to :camelcase # or one of [:none, :lover_camelcase]

希望这能有所帮助。

我在Savon上也遇到了类似的问题,最终使用字符串代替符号作为哈希键,您可以尝试以下方法:

soap.body = { 'TokenType'=> 'some_value', 'Token' => 'some_value' }

对于Savon的后续版本,在初始化Savon客户端时,您应该能够提供一个“全局”选项
convert\u request\u keys\u to

# In Savon 2
Savon.client wsdl:"http://some.url?wsdl", convert_request_keys_to: :camelcase

根据源文件中的注释,它
接受以下选项之一:lower_camelcase、:camelcase、:upcase或:none

这解决了标记camelcase的问题,谢谢。我现在唯一的问题是标记“securityToken”确实需要在开头有一个小写字母,并且通过使用CamelCase设置,savon也给出了大写字母S。遗憾的是,savon没有使用提供的WSDL检查它生成的XML,这似乎是提供ITA的全部目的,因为我没有足够的声誉,我不能投票支持你的答案,我会尽快这样做,只要我有必要的声誉…似乎默认情况是转换到较低的情况。将value设置为none解决了我的问题。如果需要自定义转换器,可以提供一个块,也可以将键作为字符串而不是符号(字符串不会被解析)