Estoy intentando acceder a un servicio SOAP que no controlo. Una de las acciones se llama ProcessMessage
. Seguí el ejemplo y generé una solicitud SOAP, pero recibí un error diciendo que la acción no existe. Indagué el problema en la forma en que se genera el cuerpo del sobre.¿Por qué se interpone el espacio de nombres "wsdl" en el nombre de la acción cuando se utiliza savon para la comunicación de ruby soap?
<env:Envelope ... ">
<env:Header>
<wsse:Security ... ">
<wsse:UsernameToken ...">
<wsse:Username>USER</wsse:Username>
<wsse:Nonce>658e702d5feff1777a6c741847239eb5d6d86e48</wsse:Nonce>
<wsu:Created>2010-02-18T02:05:25Z</wsu:Created>
<wsse:Password ... >password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</env:Header>
<env:Body>
<wsdl:ProcessMessage>
<payload>
......
</payload>
</wsdl:ProcessMessage>
</env:Body>
</env:Envelope>
Eso ProcessMessage
etiqueta debe ser:
<ProcessMessage xmlns="http://www.starstandards.org/webservices/2005/10/transport">
Eso es lo que es cuando se genera mediante la aplicación de ejemplo de Java, y funciona. Esa etiqueta es la única diferencia entre lo que genera mi aplicación Ruby y la aplicación Java de muestra. ¿Hay alguna manera de deshacerse del espacio de nombre "wsdl:"
frente a esa etiqueta y agregar un atributo como ese. Salvo eso, ¿hay alguna manera de forzar la acción para que no se genere simplemente pasando como una cadena como el resto del cuerpo?
Aquí está mi código:
require 'rubygems'
require 'savon'
client = Savon::Client.new "https://gmservices.pp.gm.com/ProcessMessage?wsdl"
response = client.process_message! do | soap, wsse |
wsse.username = "USER"
wsse.password = "password"
soap.namespace = "http://www.starstandards.org/webservices/2005/10/transport" #makes no difference
soap.action = "ProcessMessage" #makes no difference
soap.input = "ProcessMessage" #makes no difference
#my body at this point is jsut one big xml string
soap.body = "<payload>...</payload>"
# putting <ProccessMessage> tag here doesn't help as it just creates a duplicate tag in the body, since Savon keeps interjecting <wsdl:ProcessMessage> tag.
end
Probé handsoap pero no es compatible con HTTPS y es confuso. Intenté soap4r pero es aún más confuso que handsoap.
un billete para esta estaba abierta en: http://github.com/rubiii/savon/issues#issue/39 – rubiii
Hola Nick, has llegado en cualquier parte con esto ya que estoy viendo el mismo problema. –
Hola Steve. Puse esta parte del proyecto en el estado de espera, ya que había otras funciones más importantes que necesitaban implementación, y esta era una lista "agradable de tener". Voy a probar tu solución más tarde y ver si funciona. ¡Gracias por dejarme saber tú! – konung