Algo a tener en cuenta al diseñar una API RESTful es la combinación de GET y POST, como si fueran lo mismo. Es fácil cometer este error con las vistas basadas en funciones de Django y el despachador predeterminado de CherryPy , aunque ambos marcos ahora brindan una solución a este problema ( vistas basadas en clases y MethodDispatcher , respectivamente).
Los verbos HTTP son muy importantes en REST, y a menos que tengas mucho cuidado con esto, terminarás cayendo en un antipatrón REST .
Algunos marcos que lo hacen bien son web.py , Flask y Bottle . Cuando se combina con la biblioteca mimerender (divulgación completa: lo escribí), le permiten escribir buenos servicios 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 lógica del servicio se implementa solo una vez, y la selección de representación correcta (aceptar encabezado) + envío a la función (o plantilla) de procesamiento adecuada se realiza de una manera ordenada y 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!
Actualización (abril de 2012) : se agregó información sobre las vistas basadas en clases de Django, los métodos MethodDispatcher y Flask and Bottle de CherryPy. Tampoco existía cuando se hizo la pregunta.