参考

RESTful API

REST的由来

REST 这个词,是Roy Thomas Fielding 在他2000年的博士论文中提出的。

Fielding 将他对互联网软件的架构原则,定名为 REST,即 Representational State Transfer 的缩写,翻译为 表现层状态转化

如果一个架构符合 REST 原则,就称它为RESTful架构。

要理解RESTful架构,最好的方法就是去理解Representational State Transfer这个词组到底是什么意思,它的每一个词代表了什么涵义。如果你把这个名称搞懂了,也就不难体会REST是一种什么样的设计。

资源(Resources)

REST名称中 表现层状态转化中,省略了主语。表现层 其实指的是 资源(Resources)表现层

所谓 资源,本质上就是网络中的一个具体的信息。它可以是一段文本、一张图片、一个文件、一个API服务等。

你可以用一个 URL(统一资源定位符)指向一个具体的资源,每个资源可以对应一个或多个URI

我们平时浏览网页本质上就是获取各种图片、视频、HTML网页等资源的集合。

表现层(Representation)

资源具体的呈现方式,称之为 表现层

例如:一段文本可以用txt格式展示,也可以用word、html等其他格式展示。一个API返回的数据,既可以用 json格式,也可以用xml格式。

URI代表的是资源的实体,不包含它的表现形式。对于表现层的描述,可以通过HTTP请求中的Accept和Content-Type来决定。

状态转化(State Transfer)

我们通过网页上提供的各种操作来和服务端做交互,服务端最终会通过变更存储的数据以保存客户操作的结果。而 状态转化 指的就是服务端资源状态的变化并存储起来。

我们对资源的操作都是通过 HTTP 协议提供的四种基本操作:GET、POST、PUT、DELETE来进行的。

GET用于获取资源;POST用于创建资源;PUT用于更新资源;DELETE用于删除资源。

什么是RESTful架构

概念解释

符合REST原则的架构,就是RESTful架构。那么REST原则是什么呢?

主要有以下三个点:

  • 每个URI代表一个资源
  • 客户端与服务端之间,传递的是这种资源的表现层。例如:传递的是JSON数据,JSON数据是资源的一种呈现格式。
  • 客户端通过四个HTTP动词,对服务端的资源进行操作,实现资源表现层状态转化

总结为一句话,即 通过四个HTTP动词 传递资源的某种格式(即表现层) 来操作资源,换言之,即通过HTTP请求操作数据。

例子

RESTful架构的设计原则如下:

  • 资源用复数名词或短语表示
  • GET/POST/PUT/DELETE 分别表示对资源的获取、新增、更新、删除

RESTFul API

RESTFul API指的是一套符合 RESTful架构的API设计理论。

API版本

将API版本号放入URL

  1. https://api.example.com/v1/

路径(Endpoint)

路径指API的具体网址。每个网址代表一种资源,因此网址中不能有动词,只能是复数名词。名词往往与数据库的表对应

例如:

系统有张用户表:user,那么对用户的操作应该设计成:

  1. GET /users
  2. POST /users
  3. PUT /users/1 // 更新ID为1的用户
  4. DELETE /users/1 // 删除ID为1的用户
  5. GET /users/1/bankCards // 获取ID为1的用户的所有银行卡

接口命名对照表

以用户为例,例举各种场景:

语义 HTTP Method URI Action 备注 接口权限类型推荐
查询所有用户 GET /users list private
根据ID查询用户 GET /users/{id} detail protected
根据唯一字段查询单个用户 GET /users/singleQuery?userName=xxx singleQuery 支持多个参数 protected
批量查询用户 GET /users/batchQuery?userIds=1,2,3 batchQuery 参数使用逗号分隔 protected
查询数量 GET /users/count?sex=1 count 支持根据参数count protected
查询键值对数据 GET /users/kv?lastName=张 kv 支持分页和普通参数模糊查询 protected
唯一性检查 POST /users/uniqueCheck uniqueCheck protected
创建用户 POST /users create private
更新用户 PUT /users/{id} update private
删除用户 DELETE /users/{id} delete private
更新用户某属性 PATCH /users/{id}/mobile?value=135xxx updateMobile 更新用户手机号 private
激活用户 PATCH /users/{id}/active activeUser private
冻结用户 PATCH /users/{id}/freeze freezeUser private

(完)