在设计RESTful API时需要注意的是GET和POST的合并,就好像它们是同一件事一样.使用Django的function-based views和CherryPy的默认分派程序很容易犯这个错误,尽管这两个框架现在都提供了解决这个问题的方法(分别是class-based views和MethodDispatcher).
HTTP-verbs are very important,除非你非常小心,否则你最终会掉进REST anti-pattern.
一些正确的框架是web.py、Flask和Bottle.当与mimerender库(完全公开:我写的)结合使用时,它们允许您编写漂亮的RESTful Web服务:
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()
服务的逻辑只实现一次,正确的表示 Select (Accept Header)+调度到正确的呈现函数(或模板)是以一种整洁、透明的方式完成的.
$ 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):添加了关于Django基于类的视图、CherryPy的MethodDispatcher以及Flask和Valk框架的信息.在被问到这个问题时,两者都不存在.