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

标签 ruby xml soap wsdl savon

我在 Windows 7 Professional 64 位上使用 Ruby 1.9.2 和 savon 0.9.2。

我需要调用一个 Web SOAP 服务,该服务需要我从第二个 Web SOAP 服务获得的安全 token 。我使用的代码如下:

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>

别介意这个 XML 中奇怪的命名空间约定(或者只有我一个),这是 savon 做的事情。

我面临的问题是 securitytoken 标签内的标签都以小写字母开头,而它们应该是大写字母。所以<tokenType><token>应该是 <TokenType><Token> .

在我看来,这些标签的定义都在用于创建 savon 客户端的 WSDL 中。该定义似乎没有被使用或使用不正确。

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

最佳答案

对于 Savon 的更高版本,您应该能够在初始化 Savon 客户端时提供 convert_request_keys_to 的“全局”选项:

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

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

关于ruby - 使用 savon 的 SOAP 消息标记名称中的大小写问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6465553/

相关文章:

java - 需要获取父 ID,但我正在获取 Java 中 xml 标签的级别

iPhone XML SOAP 请求或 .NET Web 服务

ruby-on-rails - 使用 rails & active_paypal_adaptive_payment 执行预批准付款

ruby - 遍历数组(欧拉计划 #23)

python - 将(所有)维基百科数据加载到 mongodb 中?

ios - 解析 XML 时的调试问题

Node.js Soap 附件文件/cid href

Android:关于android webservice

ruby - 将动态定义的类作为常量访问仅适用于 const_get

Ruby 保护 block 内的外部变量