2011-11-19 3 views
0

Comment puis-je ajouter un attribut de codage à l'étiquette de corps à l'aide de Savon? J'essaie d'utiliser le savon pour me connecter à une ressource SOAP. Je peux obtenir le fichier WSDL et parcourir les méthodes.Savon: Ajout d'un codage à l'étiquette de corps

@client = Savon::Client.new("http://some.domain.com/v2messaging/service?WSDL") 

lorsque je tente d'utiliser la méthode de connexion

response = @client.request :service, :login do 
    soap.body = { 
    "String_1" => "username", 
    "String_2" => "password" 
    } 
end 

Je reçois cette erreur:

Panne/Erreur: réponse = @ client.request: service: Connexion faire Savon: : SOAP :: Fault: (env: Client) a intercepté une exception lors de la gestion de la requête: style de codage inattendu: expected = http: //schemas.xmlsoap.org/soap/encoding/, effective

La différence dans l'étiquette du corps. Voici le xml prévu (trouvé par l'application SoapUI):

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:service="etapestryAPI/service"> 
    <env:header/> 
    <env:body> 
     <service:login env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
     <String_1>username</String_1> 
     <String_2>password</String_2> 
     </service:login> 
    </env:body> 
</env:Envelope> 

Savon envoie:

<?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:service="etapestryAPI/service" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ins0="http://java.sun.com/jax-rpc-ri/internal" xmlns:ins1="etapestryAPI/service"> 
    <env:Body> 
     <service:login> 
      <String_1>username</String_1> 
      <String_2>password</String_2> 
     </service:login> 
    </env:Body> 
</env:Envelope> 

Il y a quelques différences entre ceux-ci, mais l'erreur renvoyée doit faire avec l'env: attribut encodingStyle sur la balise env: login. Comment peut-on ajouter cet attribut?

Répondre

1

J'ai figuré celui-ci. Pour ajouter un attribut à la balise de fonction (dans ce cas de connexion), vous pouvez passer un paramètre supplémentaire à la méthode:

response = @client.request :service, :login, "env:encodingStyle" => "http://schemas.xmlsoap.org/soap/encoding/" do 
    soap.body = { 
      "String_1" => "username", 
      "String_2" => "password" 
     } 
end 

Cela fonctionnera probablement maintenant sans passer le bloc.

Questions connexes