ruby - log - Problema de caso en nombres de etiquetas de mensaje SOAP usando savon
soap4r (3)
Savon usa Gyoku para la conversión de etiquetas, creo. Para cambiar la conversión de símbolo, puede insertar la siguiente declaración:
Gyoku.convert_symbols_to :camelcase # or one of [:none, :lover_camelcase]
Espero que ayude.
Estoy usando Ruby 1.9.2 con savon 0.9.2 en Windows 7 Professional 64 bit.
Necesito llamar a un servicio web SOAP que requiere un token de seguridad que obtengo de un segundo servicio web SOAP. El código que uso es el siguiente:
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
Esto da como resultado XML que se ve así:
<?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>
No importa la extraña convención del espacio de nombres (o solo soy yo) en este XML que es sabio haciendo su trabajo.
El problema al que me enfrento es que las etiquetas dentro de la etiqueta securitytoken comienzan con una letra minúscula donde deberían estar en mayúsculas. Así que <tokenType>
y <token>
deberían haber sido <TokenType>
y <Token>
.
En mi opinión, la definición de estas etiquetas está en el WSDL que se usa para crear el cliente savon. Esa definición parece no ser utilizada o utilizada incorrectamente.
¿Qué puedo hacer para obtener el mensaje XML / SOAP correcto de savon?
Tuve un problema similar con Savon y terminé usando cadenas en lugar de símbolos para mis claves hash. Podría intentar algo como:
soap.body = { ''TokenType''=> ''some_value'', ''Token'' => ''some_value'' }
Para versiones posteriores de Savon, debería poder suministrar una opción ''global'' de convert_request_keys_to
cuando inicialice su cliente Savon:
# In Savon 2
Savon.client wsdl:"http://some.url?wsdl", convert_request_keys_to: :camelcase
De acuerdo con los comentarios en el archivo fuente, accepts one of :lower_camelcase, :camelcase, :upcase, or :none
.