设计RESTful的API

 一般的简单操作,基本上都能简化为一下几种

方法 URL 类方法 备注
GET /posts index 一覧
GET /posts?key1=xxx&key2=xxx index 检索
GET /posts/create create 作成画面取得
POST /posts store 作成
GET /posts/{:id} show 取得特定资源
GET /posts/{:id}/edit edit 更新画面取得
PUT /posts/{:id} update 更新特定资源
DELETE /posts/{:id} destroy 削除特定资源

如果检索项目特别多,URL放不下的情况,最方便的做法就是直接POST

方法 URL 类方法 备注
GET /posts/searchs/create index 检索画面
POST /posts/search search

检索结果

这儿search已经是表示动作了

但是上面看起来很不RESTful,那么我们把检索条件也作为资源提交上去呢?类似于下面这种

方法 URL 类方法 备注
GET /posts/searchs/create create 検索画面
POST /posts/searchs store 検索条件提交
GET /posts/searchs/{:id} show 检索结果

感觉很别扭,主要是检索结果这项,如果把检索条件作为资源的话,那么第三项返回的应该是特定的检索条件才对,

为什么会是posts的检索结果呢?

扫描二维码关注公众号,回复: 289567 查看本文章

变通一下,如果这样呢?

方法 URL 类方法 备注
GET /posts/searchs/create create 検索画面
POST /posts/searchs store 検索条件提交
GET /posts?search_id=xxx show 检索结果

这样看起来还不错,不过处理起来确实麻烦了很多,如果不是有洁癖的话,直接用POST就比较好了。

对于删除多个资源的问题,也可以用同样的方法(实际上这儿本质是处理选择项,至于后续是删除还是其他处理,都没关系)。

方法 URL 类方法 备注
POST /posts/selections store 选择项提交
GET /posts/selections/xxx show 取得选择项

DELETE /posts/selections/xxx destroy 删除选择的posts

上面最后一项同样不RESTful,因为按照语义,这个应该是删除的上面提交的那个选择数据,而不是具体的posts

所以最后一项也可以改成这个?

方法 URL 类方法 备注
POST /posts/selections store 选择项提交
GET /posts/selections/xxx show 取得选择项

DELETE /posts?selection_id=xxx destroy 删除选择的posts

实际上,对于普通的多页面系统,只能用GET和POST方法,那么其他方法要么就放到URL里,要么就放到Form的字段里。

而且,GET以外的所有方法,其实都是POST,所以,对于DELETE其实最终还是POST,那么就直接用POST好了

方法 URL 类方法 备注

POST

(用form项目标识为DELETE)

/posts destroy 删除选择的posts

猜你喜欢

转载自weiqingfei.iteye.com/blog/2322660