看了下REST的设计思想,觉得很不错,但是事实上我觉得对资源的抽象似乎是一件很麻烦的事情。
并且我们对资源并不只有增删改查的需求,阮一峰老师的博客里有讲到,资源一定要是名字,不要是动词。
那么比如说我抽象出了article作为资源,但是可能我们对article的操作除了增删改查,还有分享等操作。
又比如如果我抽象出订单资源order,但是我可能对订单进行业务流转,订单的状态非常多变,如果都用PUT方法去请求这个资源,那提交的数据可能非常麻烦。
有没有一些已有的REST的设计项目或者示例可以参考学习呢,谢谢啦
如果楼主或其他同学用过 Rails 的话,理解 RESTFul 就会非常容易。下面我拿 blogs 举例,验证码的话,类似。
rails g scaffold blogs
默认路由
resources :blogs
为了便于理解,我加上 member, collection ... 尽管内容是空的。
resources :blogs do
member do
# ...
end
collection do
# ...
end
# ...
end
它生成的 url helper, 对应 URL, 对应 Controller#Action,你能理解下面的话,一切就很简单了。
Prefix Verb URI Pattern Controller#Action 意义
blogs GET /blogs blogs#index 文章列表页面
POST /blogs blogs#create 创建文章
new_blog GET /blogs/new blogs#new 创建文章页面
edit_blog GET /blogs/:id/edit blogs#edit 编辑文章页面
blog GET /blogs/:id blogs#show 展示文章页面
PATCH /blogs/:id blogs#update 更新文章
PUT /blogs/:id blogs#update 更新文章
DELETE /blogs/:id blogs#destroy 删除文章
说明:PATCH 和 PUT 一般不区分。
search,没有创建、没有更新、没有删除(从数据库“增删查改”角度看的话,它属于“查”),所以肯定是 GET 方法。
操作的是一个集合,还是单个对象呢?这里对的是多个对象,所以是 collection.
share, 对于文章来说一般也没有创建、没有更新、没有删除(即使有统计分享次数,也不算更新),所以可以用 GET 方法。
操作的是单个对象,所以是 member
resources :blogs do
member do
# ...
get :share # <- 这一行
put :pending
put :pay_succ
put :cancle
put :update_status
end
collection do
# ...
get :search # <- 这一行
end
# ...
end
search_blogs GET /blogs/search blogs#search 搜索文章
share_blog GET /blogs/:id/share blogs#share 分享文章
你提到的订单状态多变问题,确实是用 PUT 方法;但1)你不必传递订单的所有属性啊,只传递需要的就行了;2)你不必用同一个 action 进行操作啊,比如:pending, pay_succ, cancle 等都有自己的 action;3)要用同一个 action 也可以做判断哈,例如:update_status
(PUT 请求,对应的是 member)
明白道理后,其实很容易判断该用哪种 HTTP 方法;以及操作的是单个对象,还是集合。
还有“嵌套资源”呢,这里没有提及,以后你也会遇到,原理类似。
http://www.programmableweb.com/
这里有很多
http://coreymaynard.com/blog/creating-a-restful-api-with-php/