通过Tornado使用GET处理所有REST请求
我有一个REST(或者说几乎是REST)的网络API,
我希望API的用户能够使用所有的功能,即使他们只能发送GET请求。所以我的计划是接受一个URL参数(查询字符串),比如 request_method
,这个参数可以是GET(默认)或者POST、PUT、DELETE,我想要根据这个参数来处理请求。
我的问题是,除了在每个httpRequestHandler的 get(self)
方法中重写标准请求处理程序,并检查这个请求是否应该是POST、PUT、DELETE,然后调用相应的函数外,还有没有更通用的方式来进行这种“路由”,比如在应用定义的URL模式中,或者重写一个路由函数之类的?
为了更清楚,这些请求都是通过GET发送的,带有一个参数,比如 ?request_method=POST
。
任何建议都非常感谢。
可能的解决方案:
只使用一个 ".*" 的URL模式,并在一个单独的RequestHandler中处理所有的路由。这应该可以正常工作,但我就不能利用Tornado的URL模式匹配功能了。
在所有请求处理程序的
get(self)
方法中添加一个if
语句,检查这个请求是否应该由get
处理,如果不是,就调用相关的方法。
1 个回答
这样做是非常愚蠢的。Chrome和Firefox,还有很多其他的网页浏览器,都会在你打开一个页面时,自动尝试获取页面上的一些或全部链接,包括你的 request_method=DELETE
的网址。这样一来,你的数据库可能会被清空,仅仅因为有人在随便浏览网页。所以,千万不要故意去破坏HTTP协议。GET方法被定义为“安全”的方法,这意味着你可以随意请求任何网址,而不会造成什么坏结果。
补充说明给处于类似情况的其他人:
提问者说他在使用JSONP,并且同时控制着API服务器和客户端网页应用。在这种情况下,理想的解决方案是跨域资源共享(CORS,规范),不过这个技术需要IE8以上、Firefox 3.5以上、Safari 4以上或Chrome 3以上的浏览器。如果你需要支持更早的浏览器,并且你控制着两个域名,我建议至少将这两个域名的内容合并到你的客户端网页应用中。API域名可以保留给外部客户端,但它们会受到CORS浏览器要求的限制。