Проблема с именами тегов сообщений SOAP с использованием savon - PullRequest
7 голосов
/ 24 июня 2011

Я использую Ruby 1.9.2 с savon 0.9.2 на 64-битной Windows 7 Professional.

Мне нужно вызвать веб-службу SOAP, для которой требуется токен безопасности, полученный от второй веб-службы 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>

Не берите в голову странное соглашение о пространстве имен (или это только я) в этом XMLСавон делает свое дело.

Проблема, с которой я сталкиваюсь, состоит в том, что все теги внутри тега securitytoken начинаются со строчной буквы, где они должны быть заглавными.Так что <tokenType> и <token> должны были быть <TokenType> и <Token>.

По моему мнению, все определения этих тегов содержатся в WSDL, который используется для создания клиента savon.Это определение, похоже, не используется или используется неправильно.

Что я могу сделать, чтобы получить правильное сообщение XML / SOAP от savon?

Ответы [ 3 ]

21 голосов
/ 30 июля 2014

Для более поздних выпусков Savon вы должны иметь возможность указать глобальный параметр convert_request_keys_to при инициализации клиента Savon:

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

Согласно комментариям в исходном файле, это accepts one of :lower_camelcase, :camelcase, :upcase, or :none.

12 голосов
/ 26 июня 2011

У меня была похожая проблема с Savon, и я использовал строки вместо символов для моих хеш-ключей, вы можете попробовать что-то вроде:

soap.body = { 'TokenType'=> 'some_value', 'Token' => 'some_value' }
9 голосов
/ 26 июня 2011

Савон использует Gyoku для конвертации тегов. Чтобы изменить преобразование символов, вы можете вставить следующую инструкцию:

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

надеюсь, что это поможет.

...