Używam Ruby 1.9.2 z Savon 0.9.2 na Windows 7 Professional 64-bitowy.Problem dotyczący skrzynek w nazwach znaczników wiadomości SOAP przy użyciu savon
Muszę zadzwonić do usługi SOAP w Internecie, która wymaga tokena zabezpieczającego, który otrzymuję od drugiej usługi SOAP w sieci. Kod używam jest następująco:
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
Powoduje XML, który wygląda tak:
<?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>
Nieważne dziwną konwencję namespace (czy to tylko ja), w tym XML, który jest Savon robi jego rzecz.
Problem polega na tym, że znaczniki wewnątrz znacznika securitytoken zaczynają się od małej litery, gdzie powinny być pisane wielkimi literami. Tak więc <tokenType>
i <token>
powinny być <TokenType>
i <Token>
.
Moim zdaniem definicja tych tagów znajduje się w WSDL używanym do tworzenia klienta Savon. Definicja ta nie wydaje się być używana lub niewłaściwie stosowana.
Co mogę zrobić, aby uzyskać prawidłowy komunikat XML/SOAP od Savon?
Rozwiązało to problem tworzenia tagów CamelCase, dziękuję. Jedyny problem jaki mam teraz to to, że tag "securityToken" musi mieć małą literę na początku i przy użyciu ustawienia CamelCase savon również daje duże S. Szkoda, że savon nie używa WSDL dostarczonego do sprawdzenia XML, który generuje, wydaje się, że cały ten cel jest dostarczany. –
Ponieważ nie mam wystarczającej reputacji, nie mogę głosować na twoją odpowiedź, zrobię to, gdy tylko będę potrzebować wymaganej reputacji ... –