2011-06-24 24 views
5

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?

Odpowiedz

9

Savon używa Gyoku do konwersji tagów, które wierzę. Aby zmienić konwersję symbolu, można wstawić następującą instrukcję:

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

nadzieję, że to pomoże.

+1

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. –

+0

Ponieważ nie mam wystarczającej reputacji, nie mogę głosować na twoją odpowiedź, zrobię to, gdy tylko będę potrzebować wymaganej reputacji ... –

11

miałem podobny problem z Savon a zakończył się przy użyciu ciągów zamiast symboli dla moich klawiszy skrótu, można spróbować czegoś takiego:

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

Bardzo pomocna. Dzięki –

16

Dla późniejszych wydaniach Savon, powinieneś być w stanie dostarczyć a „globalny” opcja convert_request_keys_to podczas inicjalizacji klienta Savon:

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

Według komentarzy w pliku źródłowym, to accepts one of :lower_camelcase, :camelcase, :upcase, or :none.

+2

To powinno być zaakceptowane jako nowa (i dobra) odpowiedź. :-) –

+0

Wygląda na to, że domyślną konwersją jest lower_camelcase. Ustawienie wartości na none rozwiązało mój problem. – justingordon

+0

jeśli potrzebujesz niestandardowego konwertera, możesz albo dostarczyć blok, albo po prostu mieć klucze jako łańcuchy zamiast symboli (łańcuchy nie są przetwarzane) – Mirror318