2010-06-04 7 views

Répondre

3

Ma réponse serait: Ne pas.

Savon crée automatiquement une enveloppe pour vous. Vous pouvez passer n'importe quel en-tête et corps que vous voulez, comme des tableaux et des hachages ou des chaînes XML. Vous pouvez manipuler les espaces de noms existants (par défaut) et même remplacer les actions d'entrée. Je ne sais pas pourquoi quelqu'un aurait besoin de construire une enveloppe SOAP dans un analyseur XML tel que nokogiri.

Si la raison pour laquelle vous ne voulez pas utiliser Savon pour construire l'enveloppe est qu'il manque une sorte de fonctionnalité que le point de terminaison nécessite, faites-moi savoir quel est le problème exact. J'ai dû faire un certain nombre de changements à Savon dans le passé pour satisfaire certaines API, donc j'ai probablement déjà un correctif pour vous. Et sinon, je peux certainement vous orienter dans la bonne direction pour que vous puissiez créer votre propre patch.

Et si vous avez encore besoin de construire une enveloppe en dehors de Savon, je vous recommande de ne pas utiliser du tout Savon et d'envoyer simplement le XML via l'une des nombreuses librairies http superbes.

EDIT:

Pour illustrer comment utiliser les en-têtes SOAP (et les espaces de noms), vous pouvez les inclure ainsi que le corps dans la méthode de requête:

client = Savon::Client.new "http://url.to/wsdl" 

response = client.get do |soap| 
    # Use merge! for namespaces so that you don't overwrite all of the original namespaces (while still retaining the ability to overwrite individual ones) 
    soap.namespaces.merge!({ 
    "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", 
    "xmlns:xsd" => "http://www.w3.org/2001/XMLSchema" 
    }) 

    # Use soap.header just like you would soap.body 
    soap.header = { 
    # SOAP header hash 
    } 

    # soap.body as usual 
    soap.body = { 
    # SOAP body hash 
    } 
end 
+0

merci, je voudrais utiliser Savon, mais quand j'ai vérifié la documentation, je n'étais pas clair qu'il mettrait les en-têtes dedans. Fondamentalement je dois seulement mettre le corps et n'importe quoi en dehors des têtes de savon en utilisant Savon? – Angela

+0

Angela, il est très possible de spécifier les en-têtes SOAP. S'il vous plaît voir mon édition pour voir comment. – vonconrad

1

Savon traite les entrées aux services SOAP comme Nested Des hachages L'enveloppe est construite par Savon, vous ne devriez donc pas trop vous inquiéter à ce sujet, voire pas du tout.

Avez-vous réellement réussi à vous connecter au service et si oui, quelles erreurs obtenez-vous?

Si vous ne vous êtes pas encore connecté et/ou si vous avez des problèmes avec le concept de la façon de procéder, les éléments suivants devraient vous aider à démarrer.

require 'savon' 

client = Savon::Client.new http://api.postalmethods.com/PostalWS.asmx?wsdl 
response = client.UploadFile do |soap| 
    soap.body = { 
    "Username" => "My User", 
    "Password" => "My password" 
    ... 
    } 
end 

Si vous remplissez les blancs à ... cela devrait vous aider à démarrer, bien que l'analyse du fichier WSDL peut ne pas être le moyen d'aller de l'avant dans la production. Jetez un oeil à la documentation de Savon pour les problèmes spécifiques que vous avez.

Modifier

Si vous n'êtes pas sûr de SOAP et puis Savon vous pouvez simplement utiliser the postalmethods gem comme décrit here, plutôt que de réinventer la roue

+0

okay, super - qu'est-ce que cela signifie que l'analyse de la wsdl peut ne pas être le moyen d'aller de l'avant dans la production? J'ai vu ça dans la documentation ... – Angela

+0

Bien analyser le wsdl, ce que vous faites lorsque vous passez le wsdl à une nouvelle instance de Savon :: Client est un exercice assez coûteux. Vous n'avez pas vraiment besoin de le faire une fois que vous avez établi les paramètres corrects à passer. Si j'étais vous, je travaillerais sur quelque chose comme ce qui précède et voir si cela fonctionne et si cela fonctionne assez rapidement, puis prendre une décision quant à savoir si vous pouvez le faire sans le wsdl. –

+0

Je vois - alors si cela fonctionne, je n'utiliserais pas ce code aller de l'avant ...? – Angela

Questions connexes