首页 > 求有关REST API设计的例子

求有关REST API设计的例子

看了下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/

【热门文章】
【热门文章】