Pages

samedi 25 juillet 2009

Appeler Curl depuis un program Python 3.1

Curl (un client HTTP en ligne de commande) est très pratique à utiliser pour tester manuellement les requêtes Rest. Il permet en particulier de manipuler les headers ou les méthodes HTTP.

Par exemple :
# envoi des données en JSON en paramétrant le header
curl -i -H 'Content-Type: application/json'
-d '{"items":[{"title": "AAA AAA", "description": "aaa aaa aaa",
"link": "http:AAA.com"}]}' http://${SERVER}/rest/messages

# suppression du message avec la methode DELETE
curl -X DELETE http://${SERVER}/rest/messages/1

J'ai fait un petit programme Python pour faciliter la construction des différentes requêtes Rest. Le programme Python permet de sélectionner le server GAE local/remote, le type d'opération, le variant pour l'input, l'output demandé et saisir les données à envoyer.

Appeler Curl m'a posé quelques problèmes.
Pycurl (une intégration curl/python) n'existe pas pour python 3.1. J'ai donc implémenté les appels de commande externes directement en Python. Mais j'ai eu un peu de mal à trouver les informations car les I/O Python ont pas mal changées au cours du temps. Voici le code qui permet d'appeler une commande et récupérer la sortie standard en Python 3.1.


On utilise Popen du module subprocess. La méthode communicate() crée un tableau où 0 contient la sortie standard et 1 la sortie erreur.
Si vous voulez rediriger la sortie erreur sur la sortie standard, utilisez stderr=STDOUT.
Pour une raison qui m'échappe le passage de la commande en tableau a cessé de fonctionner, mais la concaténation de chaînes à résolu ce problème.


1 commentaire:

Unknown a dit…

Bonjour

Je pense également à utiliser curl via subprocess plutôt que via pyCurl, mais qu'en penser ? C'est moins pythonique mais c'est quand même drôlement plus simple et clair au final. Et niveau performances cela change quelque chose ? Bref si vous aviez quelques arguments pour/contre cela m'intéresse.

Fred