Une chose à laquelle il faut faire attention lors de la conception d'une API RESTful est la fusion de GET et POST, comme si c'était la même chose. Il est facile de commettre cette erreur avec les vues basées sur les fonctions de Django et le répartiteur par défaut de CherryPy , bien que les deux frameworks fournissent désormais un moyen de contourner ce problème ( vues basées sur les classes et MethodDispatcher , respectivement).
Les verbes HTTP sont très importants dans REST, et à moins que vous ne soyez très prudent à ce sujet, vous finirez par tomber dans un anti-modèle REST .
Certains frameworks qui réussissent sont web.py , Flask et Bottle . Lorsqu'ils sont combinés avec la bibliothèque mimerender (divulgation complète: je l'ai écrite), ils vous permettent d'écrire de jolis services Web RESTful:
import web
import json
from mimerender import mimerender
render_xml = lambda message: '<message>%s</message>'%message
render_json = lambda **args: json.dumps(args)
render_html = lambda message: '<html><body>%s</body></html>'%message
render_txt = lambda message: message
urls = (
'/(.*)', 'greet'
)
app = web.application(urls, globals())
class greet:
@mimerender(
default = 'html',
html = render_html,
xml = render_xml,
json = render_json,
txt = render_txt
)
def GET(self, name):
if not name:
name = 'world'
return {'message': 'Hello, ' + name + '!'}
if __name__ == "__main__":
app.run()
La logique du service n'est implémentée qu'une seule fois, et la sélection de représentation correcte (en-tête Accept) + la répartition vers la fonction de rendu appropriée (ou modèle) est effectuée de manière ordonnée et transparente.
$ curl localhost:8080/x
<html><body>Hello, x!</body></html>
$ curl -H "Accept: application/html" localhost:8080/x
<html><body>Hello, x!</body></html>
$ curl -H "Accept: application/xml" localhost:8080/x
<message>Hello, x!</message>
$ curl -H "Accept: application/json" localhost:8080/x
{'message':'Hello, x!'}
$ curl -H "Accept: text/plain" localhost:8080/x
Hello, x!
Mise à jour (avril 2012) : ajout d'informations sur les vues basées sur les classes de Django, les frameworks MethodDispatcher et Flask and Bottle de CherryPy. Aucun n'existait à l'époque où la question a été posée.