J'essaie d'accéder à un service SOAP que je ne contrôle pas. L'une des actions s'appelle ProcessMessage
. J'ai suivi l'exemple et généré une requête SOAP, mais j'ai reçu en retour une erreur indiquant que l'action n'existe pas. J'ai trouvé la cause du problème dans la façon dont le corps de l'enveloppe est généré.
<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>
Ce ProcessMessage
devrait être :
<ProcessMessage xmlns="http://www.starstandards.org/webservices/2005/10/transport">
C'est ce qu'il est lorsqu'il est généré par l'exemple d'application Java, et cela fonctionne. Cette balise est la seule différence entre ce que mon application Ruby génère et l'exemple d'application Java. Existe-t-il un moyen de se débarrasser de la balise "wsdl:"
devant cette seule balise et ajouter un attribut comme celui-ci. Sinon, y a-t-il un moyen de forcer l'action à ne pas être générée en la passant simplement comme une chaîne de caractères comme le reste du corps ?
Voici mon code :
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
J'ai essayé handsoap mais il ne supporte pas HTTPS et est confus. J'ai essayé soap4r mais c'est encore plus confus que handsoap.