2009-10-10 8 views
1

Je dois implémenter un petit utilitaire de test qui consomme des messages SOAP XML (HTTP POST) extrêmement simples. C'est un protocole que je dois prendre en charge, et ce n'est pas ma décision de conception d'utiliser SOAP (j'essaie simplement d'éviter les réponses "pourquoi utilisez-vous le protocole X?")Une approche minimaliste et non-entreprise pour un serveur SOAP en Python

Je voudrais utiliser des trucs qui sont déjà dans l'installation de base de python 2.6.x. Quelle est la meilleure façon de faire cela? Le seul message SOAP est vraiment simple, je préfère ne pas utiliser d'outils d'entreprise comme la génération de classes WSDL si possible.

J'ai déjà implémenté la même fonctionnalité plus tôt dans Ruby avec simplement HTTPServlet :: AbstractServlet et l'analyseur REXML. J'ai bien travaillé.

Je me pensais que je pouvais une solution similaire en Python avec BaseHTTPServer, BaseHTTPRequestHandler et l'analyseur elementree, mais il est pas évident comment je peux lire le contenu de mon POST SOAP entrant un message. La documentation n'est pas si grande IMHO.

Répondre

3

Vous pouvez écrire une fonction WSGI (voir wsgiref) et analyser à l'intérieur un corps de requête HTTP à l'aide du module xml.etree.ElementTree.

SOAP est fondamentalement très simple, je ne suis pas sûr qu'il mérite un module spécial. Utilisez simplement une bibliothèque de traitement XML standard que vous aimez.

+0

Merci, je vais regarder dans l'API WSGI. Cela sonne une cloche, je pourrais avoir un peu de code Google App Engine qui analyse le contenu d'une demande POST. Cela aidera aussi si les API du moteur App sont également basées sur WSGI. – auramo

1

J'ai écrit quelque chose comme ça dans Boo, en utilisant un .Net HTTPListener, parce que moi aussi j'ai dû implémenter le WSDL défini par quelqu'un d'autre. Le WSDL J'ai reçu le document/le format littéral utilisé (vous devrez apporter quelques ajustements à cette information si votre WSDL utilise rpc/encoded). J'ai enveloppé le HTTPListener dans une classe qui permettait au code client d'enregistrer les rappels par l'action SOAP, puis donnais à cette classe une méthode Start qui déclenchait le HTTPListener. Vous devriez être en mesure de faire quelque chose de très similaire en Python, avec une méthode getPost() sur BaseHTTPServer à:

  • extrait l'action SOAP des en-têtes HTTP
  • utilisation elementtree pour extraire le SOAP en-tête et SOAP corps de la POSTées HTTP
  • appel du rappel défini pour la action SOAP, l'envoi de ces valeurs extraites
  • retour le texte de la réponse donnée par la fonction de rappel dans un SOAP correspondant enveloppe; si le rappel soulève une exception , l'attraper et remballer comme un savon faute

Ensuite, vous implémentez juste un rappel par action SOAP, qui obtient le contenu XML qui lui est passé, parse cela avec elementtree, effectue l'action désirée (ou action fictive si testeur), et construit la réponse XML nécessaire (je n'étais pas trop fier de créer cela explicitement en utilisant l'interpolation de chaîne, mais vous pourriez utiliser elementtree pour créer ceci en sérialisant un objet réponse Python) .

Il vous sera utile si vous pouvez obtenir de vrais exemples de messages SOAP afin de vous aider à ne pas arracher vos cheveux, en particulier dans la partie où vous créez le XML de réponse nécessaire.

+0

Boo/.Net n'est pas exactement Python :-) Mon problème n'est pas conceptuel, c'est l'implémentation exacte qui fonctionne. J'ai aussi déjà une implémentation de Ruby. – auramo

Questions connexes