Я использую 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?