Skip to content
On this page

REST 接口规范学习

[toc]

面向资源设计

REST 的架构风格在 2000 年首次被引入,与 HTTP/1.1 有着良好的相性。他的核心原则在于定义一些可以被少量方法操作的资源。毫无疑问资源是个名词,方法是个动词。在 HTTP 协议中,资源名称很自然地被映射到 URLs 上,方法则被映射成了 HTTP 的 POST、GET、PUT 和 DELETE 四种方法

REST API

REST API 被建模为可以被单独寻址的资源(API 的名词)的集合。资源可以被他们的资源名称引用,并通过一小组方法(也称为动词或操作)来进行操作

资源

一个面向资源的 API 通常被建模为资源层级,其中每个节点都是一个简单资源或是一个集合资源。为了方便起见,它们通常分别被称为资源和集合

集合包含相同类型的资源列表。例如,用户拥有一个联系人集合。

资源有一些状态和零个或多个子资源。 每个子资源可以是简单资源或集合资源。

例如,Gmail API 包含一个用户集合,每个用户都有一个消息集合,一个邮件线集合,一个标签集合,一个个人资料资源以及多个设置资源。 尽管存储系统和 REST API 之间存在一些概念上的一致性,但具有面向资源的 API 的服务不一定是数据库,并且在解释资源和方法方面具有极大的灵活性。例如,创建一个日历事件(资源)可能为与会者创建其他事件,向与会者发送电子邮件邀请,预定会议室以及更新视频会议日程安排。

方法

标准方法

参考https://google-cloud.gitbook.io/api-design-guide/standard_methods

一个面向资源的 API 的关键特征是它强调资源(数据模型)而不是在资源上执行的方法(功能)。一个典型的面向资源的 API 会暴露大量携带少量方法的资源。

基于 http 协议,方法我们映射为 HTTP 的 POST、GET、PUT 和 DELETE 四种标准动词

HTTP METHOD

作用范围:

  • GET-获取资源,
  • POST-创建资源
  • PUT-更新资源,不区分资源全量、部分属性更新
  • DELETE-删除资源

自定义方法

自定义方法指的是除了五种标准方法以外的 API 方法。他们只会用于那些无法轻易通过标准方法来表达的功能上。一般来说,API 设计者应该在条件允许的情况下尽可能地使用标准方法。标准方法有着更简单且定义明确的语义,更为大部分开发人员所熟知,所以他们更容易被使用且更不容易出错。标准方法的另一个优势是 API 平台对标准方法有着更好的支持,例如错误处理、日志、监控等。

一个自定义方法可以与资源、集合或服务相关联。它可能携带任意请求、返回任意响应,也可能支持流式请求和流式响应。

对于自定义方法,它们应该使用如下通用 HTTP 映射:

POST https://service.name/v1/some/resource/name:customVerb

使用:代替'/'来将自定义动词从资源名称中分离是为了支持任意的路径。举个例子,撤销删除一个文件可以映射到

POST /files/a/long/file/name:undelete

通用自定义方法可参考:https://google-cloud.gitbook.io/api-design-guide/custom_methods#tong-yong-zi-ding-yi-fang-fa

目前我们使用自定义方法的场景举例

GET 请求参数过多,有些浏览器和 Server 对 url 长度有限制,这种情况下无法使用 GET

针对分页查询,如果使用自定义方法,分页参数应该放置于 Query Params 中

资源名称

参考https://google-cloud.gitbook.io/api-design-guide/resource_names

完整资源名称://API 服务名/相对资源名称

在这个基础上,调整 API 服务名

API 服务名 = 内部服务专用的伪 DNS 名/应用名称

以中台用户服务获取用户信息为例:

API 服务名应该为:abp-test.ayla.com.cn/mp-user

相对资源名称:/users/

完整资源路径://abp-test.ayla.com.cn/mp-user/users/{userId}

客户端访问完整的资源名称:GET https://abp-test.ayla.com.cn/mp-user/users/{userId}

以中台用户服务获取用户设置信息为例:

客户端访问完整的资源名称:GET https://abp-test.ayla.com.cn/mp-user/users/{userId}/settings

版本管理

使用前期确定的版本管理规范:https://aylaasia.atlassian.net/wiki/spaces/RDCEN/pages/1613987936

在资源路径前添加 API 主版本

GET https://api.abp-test.ayla.com.cn/mp-user/v1/users/{userId}

GET https://api.abp-test.ayla.com.cn/mp-user/v2/users/{userId}

MIT License.