周梦康 发表于 2016-01-05 7624 次浏览 标签 : REST

要深入理解REST,需要理解REST的五个关键词:

  1. 资源(Resource)

  2. 资源的表述(Representation)

  3. 状态转移(State Transfer)

  4. 统一接口(Uniform Interface)

  5. 超文本驱动(Hypertext Driven)

资源

关于资源的理解在http://mengkang.net/620.html里已经说了很多了。

资源的表述

实际是资源暴露出来的展现形式,拿[GET]访问的请求来说就是通过浏览器访问某个地址之后所得到的内容。

状态转移

我所理解的,将客户端对资源操作的状态通过 Api 的请求转移到服务端。比如客户端需要删除某个资源,请求完,服务器端该资源的状态也是删除的了。

统一接口

REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。以HTTP/1.1协议为例,HTTP/1.1协议定义了一个操作资源的统一接口,主要包括以下内容:

  1. 7个HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS

  2. HTTP头信息(可自定义)

  3. HTTP响应状态代码(可自定义)

  4. 一套标准的内容协商机制(即接口内容输出之后,各个字段各个对象如何解析的定义)

  5. 一套标准的缓存机制

  6. 一套标准的客户端身份认证机制

超文本驱动

就像网页里的超链接,得到当前接口的返回内容,app 布局上对应的各个按钮下一步可能会请求 api 需要在当前 api 予以给出。

举个例子 https://developer.github.com/v3/git/commits/#get-a-commit 返回的内容为

{
  "sha": "7638417db6d59f3c431d3e1f261cc637155684cd",
  "url": "https://api.github.com/repos/octocat/Hello-World/git/commits/7638417db6d59f3c431d3e1f261cc637155684cd",
  "author": {
    "date": "2014-11-07T22:01:45Z",
    "name": "Scott Chacon",
    "email": "schacon@gmail.com"
  },
  "committer": {
    "date": "2014-11-07T22:01:45Z",
    "name": "Scott Chacon",
    "email": "schacon@gmail.com"
  },
  "message": "added readme, because im a good github citizen\n",
  "tree": {
    "url": "https://api.github.com/repos/octocat/Hello-World/git/trees/691272480426f78a0138979dd3ce63b77f706feb",
    "sha": "691272480426f78a0138979dd3ce63b77f706feb"
  },
  "parents": [
    {
      "url": "https://api.github.com/repos/octocat/Hello-World/git/commits/1acc419d4d6a9ce985db7be48c6349a0475975b5",
      "sha": "1acc419d4d6a9ce985db7be48c6349a0475975b5"
    }
  ]
}

里面的parents节点里有一个url字段,而对应的客户端上有一个查看其父节点的按钮,点击那个按钮,就会向这个url对应的api发送请求了。

下一步操作的执行,不是客户端需要自身关心的,而是api返回的文档内容驱动的。


个人觉得,这些标准实际在我们开发的时候无形中就实现并遵守了,就想数据库设计范式一样,不遵守,没法玩了。

 Rest 详细文章介绍请参考  深入理解 RESTful Api 架构

👇 下面是我的公众号,高质量的博文我会第一时间同步到公众号,给个关注吧!

评论列表

回复 Aidan 2016-05-10 20:06:33
看了好多人写的REST,还是博主解释的比较透彻,学习了