设计 RESTful 风格的 api, 获取短信验证码的接口应该放在哪个资源下比较好

rt, 除了获取短信验证码的接口, 还会有一些操作, 比如搜索接口, 都只是一个动作, 这些大家在设计RESTful风格的api时, 是如何设计的呢?

为了更详细的描述这个问题, 我举几个例子, 我指的是放在哪个资源下, 而不是动作
例如
post /users 代表注册
get /users 代表获取用户信息
post /sessions 代表登录
delete /sessions 代表退出
这里 sessions, users 就是资源

阅读 10.9k
9 个回答

如果楼主或其他同学用过 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 一般不区分。

搜索,没有创建、没有更新、没有删除(从数据库“增删查改”角度看的话,它属于“查”),所以肯定是 GET 方法。
操作的是一个集合,还是单个对象呢?这里对的是多个对象,所以是 collection

resources :blogs do
  member do
    # ...
  end

  collection do
    # ...
    get :search # <- 这一行
  end

  # ...
end
search_blogs GET    /blogs/search   blogs#search  搜索文章

search 按照 RESTFul 来看,其实和 index 是一样的,都是 GET 请求,针对的都是集合。

其它的操作,需要楼主联想,在此就不展开了。

按照restful的规范(名字只能是一个名词/资源,不能出现动词),可以如下:

GET /messageCode 获取验证码
POST /messageCode 刷新验证码
DELETE /messageCode 让那个验证码过期
PUT /messageCode 这个好像用不上...因为直接get那步就搞定了

搞不懂为什么采纳楼上的答案,这明显是回避了问题,只是把restful最适合的增删改查拿了出来。而对于本题的,短信验证码的api,却避而不谈。

说说我的理解吧:这个接口不应该用restful设计。
很简单,短信验证码的名词大家都是懂的:sms/sms-code/verify-code等等。但是,4个HTTP动词根本就没办法表达发送。
很简单,这4个动词只考虑了最一般的情况,要么就像楼上那样,强制说:我的get就是表达发送的意思。但其实这样是不对的,因为get在restful是从api获取信息的意思,同时也是幂等的,而这里api不是返回信息,而是发送验证码到用户手机,同时,也不是幂等的,这次调了,下次再调,是不一样的。
现在我的实现是这样:简单的在sms-code后加上一个动词,send,也就是sms-code/send,然后HTTP动词用post。

如果是想实现短信验证码登录,试试一些集成的账号系统吧,http://www.onlyid.net 之类的,没这些麻烦事。

用messageCode来定义资源,然后资源表述定义为get||search,按照你的提问我是这么理解的.

哈。我们项目是直接用/api/sms的。当时也没注意这么多,用得是POST,主要是考虑到每次POST 会增加服务器上的某些资源

新手上路,请多包涵

我司这么理解的,如果执行资源操作的人是请求者,那就用名词做uri,如果执行资源操作的是服务器或者其他就创建一个服务请求,我记得有一个比较好的例子是转账业务,用transaction做uri。所以短信验证码我觉得用一个创建一个短信通知比较合理。比如sms-notify

新手上路,请多包涵

遇见搜索咋处理呢?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进