HTTP 协议本身是很语义化的东西,RESTful 的目的是希望 HTTP 中语义化的成分能和你的接口设计相对应,说白了是让协议和应用相统一的规范。
但是协议所能表达的语义有限,不可能要求所有的事情都用 GET POST PUT DELETE 等表达,因此我现在的做法是将可以归入 RESTful 范畴的接口用 RESTful 的规范设计,不好归入的在 URL 中加入动词,用 POST 方法做请求。拿 V2EX 的主题顶踩为例,我会设计为 POST /topics/:id/voteup,POST /topics/:id/votedown,并在代码或文档中注明这个接口和其他 RESTful 接口的区别。
至于 Status Code 的使用,个人认为统一的意义大于规范性,如果你是从头开始主导的项目,当然可以用 Status Code 的不同区分返回的错误,如 @
cloudzhou 所列出的那些。但是如果半途加入一个项目,这个项目之前已经是使用 200 返回所有请求,重新设计 Status Code 的成本太高,甚至可能对其他业务造成影响,这时可以考虑在返回数据中描述返回结果的状态。RESTful 也并不是就限制死了你对它的使用,使用方式见仁见智。吸取其中适合自己的成分,作出适合团队协作,提升开发效率,清晰而稳健的接口设计,就是最好的。