Beim Entwerfen einer RESTful-API ist die Verschmelzung von GET und POST so zu beachten, als ob sie dasselbe wären. Es ist leicht, diesen Fehler mit den funktionsbasierten Ansichten von Django und dem Standard-Dispatcher von CherryPy zu machen , obwohl beide Frameworks jetzt einen Weg bieten, um dieses Problem zu umgehen ( klassenbasierte Ansichten bzw. MethodDispatcher ).
HTTP-Verben sind in REST sehr wichtig , und wenn Sie nicht sehr vorsichtig sind, fallen Sie in ein REST-Anti-Pattern .
Einige Frameworks, die es richtig machen, sind web.py , Flask und Bottle . In Kombination mit der Mimerender- Bibliothek (vollständige Offenlegung: Ich habe sie geschrieben) können Sie nette RESTful-Webservices schreiben:
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()
Die Logik des Dienstes wird nur einmal implementiert, und die richtige Auswahl der Darstellung (Kopfzeile akzeptieren) + Versand an die richtige Renderfunktion (oder Vorlage) erfolgt auf ordentliche, transparente Weise.
$ 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!
Update (April 2012) : Informationen zu den klassenbasierten Ansichten von Django, CherryPys MethodDispatcher und Flask and Bottle-Frameworks hinzugefügt. Beides existierte nicht, als die Frage gestellt wurde.