根据REST APIs的成熟度模型 ,此规范关注的是Level 2的APIs。 

1 设计指南

HTTP APIs主要由四部分组成:HTTP,URL,资源资源的表述(JSON)。资源的表述格式通常都采用JSON,故而后面就使用JSON代指资源的表述。根据这些组成部分,按照以下3个步骤设计APIs:

  1. 基于资源设计APIs。
  2. 基于URL标识资源
  3. 基于JSONHTTP操作URL标识的资源

1.1 基于资源设计API

设计HTTP APIs的首要任务是识别出业务领域中存在的资源。资源是对服务端提供的服务进行分解、组合后的一个被命名的抽象概念。

有一个很重要的点需要明确一下:资源≠数据表,它们两个之间并没有直接的映射关系。如果直接把数据存储结构映射为资源,则只会让资源无法有效的表达业务需要,也会造成资源本身和底层存储的紧耦合。

资源的设计是以名词为中心的。比如今天的天气是一个资源;而获取今天的天气则不是,它代表的是对今天的天气资源的一个读取操作。基于此我们可以抽象出来一个天气的资源。

1.2 基于URL标识资源

识别出资源后,则需要为其分配一个URL进行标识。

  1. 一个资源可以有多个URL
  2. 一个URL只能标识一个资源

总结来说就是资源:URL的关系就是1:N的关系。

比如上面提到的天气今天的天气这两个资源,可以用如下的URL进行标识。

资源 URL
天气 /weathers
今天的天气 /weathers/today
今天的天气 /weathers/2018-04-01,今天是2018-04-01

资源体现在URL中的Path部分;如果资源代表的是一个集合,则以复数的形式出现。

资源存在子资源的情况下,可以把子资源提升为顶层的资源。比如有一个订单资源/orders/{order_id},订单中包含2件物品。

# 不推荐 单个子资源
/orders/{order_id}/items/{item_id} # 推荐 单个子资源
/order-items/{order_item_id} # 推荐 子资源集合
/orders/{order_id}/items

1.3 基于JSONHTTP操作URL标识的资源

在标识出资源以后,就可以使用HTTP通过JSON来操作资源了。

  1. 使用HTTP Method来映射对资源的操作请求(CRUD或者其他)。
  2. 使用HTTP Header携带请求/响应所需的元数据信息。
  3. 使用HTTP Stauts Code代表HTTP协议层面的响应状态。
  4. 使用JSON作为数据交换格式。

2 规范指南

2.1 通用部分

  1. HTTP Method 规范
  2. HTTP Header 规范
  3. HTTP Stauts Code 规范
  4. URL 规范
  5. JSON 规范
  6. 命名(URL和JSON)规范
  7. 日期和时间格式化 规范
  8. 国际化 规范

2.2 API版本化

Level 2的HTTP APIs中,虽然我们推荐也努力使得我们的APIs不做不兼容的改动,但是依然无法彻底的避免不兼容的升级。这就使得我们不得不进行对APIs进行版本管理。通常有以下3种方案:

  1. URL

    GET http://api.linianhui.com/v1/resources HTTP/1.1
  2. Request Header
    GET http://api.linianhui.com/resources HTTP/1.1
    Api-Version: v1
  3. Request Header (Accept Header)
    GET http://api.linianhui.com/resources HTTP/1.1
    Accept: application/vnd.v1+json

Level 2中优先推荐使用方案1。理由是其更直观,便于实现,便于日志追踪。

2.3 错误处理

虽然HTTP Stauts Code4xx5xx的状态码来表示哪里出错了,但是其代表的只是HTTP协议层面的错误描述,它无法提供和业务相关的更具体错误描述。基于此种情况,我们需要设计一套描述业务层面错误的数据结构:

[
{
"error": "user_name",
"message": "用户名不能为空。"
},
{
"error": "age",
"message": "用户年龄不能小于0。"
}
]
  1. 这个数据结构仅在状态码为4xx5xx出现的时候才会使用;2xx的时候则不包含此数据结构。
  2. error字段可以是一些出错的字段名、某一错误类别(比如no_permission)等等。
    [
    {
    "error": "no_permission",
    "message": "没有user.delete的权限"
    }
    ]

2.4 Request 公共查询参数

参数用途 参数名 取值范围
分页 page
page_size
>=1
排序 sort {field_name}|{asc|desc},{field_name}|{asc|desc}
区间 {field_name}_before
{field_name}_after
无要求
时间 {field_name}_at 无要求

示例:

GET /users?page=2&page_size=10&sort=name,age|desc&created_at_after=2018-01-01&created_at_before=2018-06-01 HTTP/1.1

上面的查询代表的含义:按照name升序和age倒序的排序方式;获取created_at时间位于2018-01-012018-06-01区间内;按照每页10条数据,获取第2页的数据。

2.5 Response 分页数据结构

在分页请求的时候,API会返回分页后的数据和分页的信息。

{
"page": 2,
"page_size": 10,
"total_count": 100,
"items":[
{...},
{...},
]
}

3 示例

... 待补充

参考资料

PayPal的API设计指南:https://github.com/paypal/api-standards

REST架构风格的出处:架构风格与基于网络的软件架构设计(by Fielding, R.)论文。

  1. 英文版: https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
  2. 中文版: http://www.infoq.com/cn/minibooks/web-based-apps-archit-design
  3. 本人的解读REST系列博客:http://www.cnblogs.com/linianhui/category/774322.html

HTTP APIs 四大组成部分(HTTP,URI,MIME,JSON)

  1. HTTP/1.1 ( RFC7230-7235 ) :https://tools.ietf.org/html/rfc7230
  2. URI ( RFC 3986 ) :https://tools.ietf.org/html/rfc3986
  3. MIME ( RFC 2387 ):https://tools.ietf.org/html/rfc2387
  4. JSON : http://json.org/

Hypermedia

  1. JSON Schema: http://json-schema.org/

URL模板

  1. URI Template ( RFC6570 ) :https://tools.ietf.org/html/rfc6570

时间日期格式化

  1. Date and Time Formats - ISO 8601:https://www.w3.org/TR/NOTE-datetime
  2. Date and Time on the Internet: Timestamps ( RFC 3339 ) :https://tools.ietf.org/html/rfc3339#section-5.6

国际化

  1. https://www.iso.org/iso-3166-country-codes.html
  2. https://www.iso.org/iso-4217-currency-codes.html
  3. https://www.iso.org/iso-639-language-codes.html

REST APIs 成熟度模型:https://martinfowler.com/articles/richardsonMaturityModel.html

HTTP APIs 设计/规范指南的更多相关文章

  1. ASIC设计-终极指南

    ASIC设计-终极指南 ASIC Design – The Ultimate Guide ASIC设计-终极指南 ASICs代表特定于应用的集成电路,指的是针对特定应用而设计的半导体解决方案,与其他解 ...

  2. JavaScript编码规范指南

    前言 本文摘自Google JavaScript编码规范指南,截取了其中比较容易理解与遵循的点作为团队的JavaScript编码规范. JavaScript 语言规范 变量 声明变量必须加上 var  ...

  3. atitit.api设计 方法 指南 手册 v2 q929.docx

    atitit.api设计 方法 指南 手册 v2 q929.docx atitit.api设计原则与方法 1. 归一化(锤子钉子理论)1 1.1. 链式方法2 1.2. 规则5:建立返回值类型2 1. ...

  4. MarkDown编写规范指南

    Markdown 编写规范指南 简介: Markdown的目标是实现「易读易写」,成为一种适用于网络的「书写语言」. 一份使用Markdown格式撰写的文件可以直接以纯文本发布,它的最大灵感来源其实是 ...

  5. OC 开发规范指南 - 个人见解写的很好

    纽约时报 移动团队 Objective-C 规范指南 这份规范指南概括了纽约时报 iOS 团队的代码约定. 介绍 关于这个编程语言的所有规范,如果这里没有写到,那就在苹果的文档里: • Objecti ...

  6. 最全面的 Android 编码规范指南

    最全面的 Android 编码规范指南 本文word文档下载地址:http://pan.baidu.com/s/1bXT75O 1. 前言 这份文档参考了 Google Java 编程风格规范和 Go ...

  7. #Google HTML&CSS规范指南

    Google HTML&CSS规范指南 翻译自原文 目录 Google HTML&CSS规范指南 1. 背景 2. 通用 2.1 通用样式规则 2.1.1 协议 2.2 通用格式规则 ...

  8. 字节跳动前技术总监开源分享《Android架构设计权威指南》,YYDS!

    架构就像是一场进化史,根据不同时期的需求,演变出不同的架构,车轮滚滚,到今天,移动端框架百花齐放,让人目不暇接.但是其中的本质是磨灭不了的,换言之根本没有磨灭而是隐藏到了人们所看不到的地方,但是依旧发 ...

  9. Git常用命令和Git团队使用规范指南

    转自:https://wsgzao.github.io/post/git/ 前言 在2005年的某一天,Linux之父Linus Torvalds 发布了他的又一个里程碑作品——Git.它的出现改变了 ...

随机推荐

  1. 工厂交接班易出问题?MES系统实现精准对接

    工厂交接班制度非常的严格和复杂,而MES系统能让繁琐的交接班流程简单快捷无措.MES系统在发生事件时记录传递事件,还可以主动对事件进行分类和报告.人员可以查看和深入到以前或当前班次的个别事件. 随着工 ...

  2. FreeRTOS软件定时器

    API函数 //创建 TimerHandle_t xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriod ...

  3. centos7 上Docker安装与启动

    1.  docker  centos 文档地址 https://docs.docker.com/install/linux/docker-ce/centos/ 2. 安装环境说明: docker社区版 ...

  4. CentOS8-在hyper-V安装选项

    安装选项select Server with a GUI.后重启卡在黑屏无法启动. 后改选: Select software to be installed.  Choose the Workstat ...

  5. SQL SERVER- waitresource解读

    例如: OBJECT: 18:1769220894:8 第一个是dbid:18,第二个是objectid:1769220894,第三个是indexID:8 SELECT DB_NAME(18)SELE ...

  6. HashMap不足性分析

    不足性: 1.缺陷就在于其高度依赖hash算法,如果key是自定义类,你得自己重写hashcode方法,写hash算法. 而且hashmap要求,存入时的hashcode什么样,之后就不能在变更,如果 ...

  7. HashMap扩容死循环问题

    原文:https://blog.csdn.net/Leon_cx/article/details/81911223 下面我们来模拟一下多线程场景下扩容会出现的问题: 假设在扩容过程中旧hash桶中有一 ...

  8. sqoop从oracle数据库抽取数据,导入到hive

    环境: hadoop-2.7.5 sqoop-1.4.7 zookeeper-3.4.10 hive-2.3.3 (使用mysql配置元数据库) jdk1.8.0_151 oracle 11.2.0. ...

  9. memoryCache 和 diskCache 的相关总结

    一.缓存位置 在浏览器开发者工具的 Network 的 Size 栏会出现的三种情况: from Service Worker from memory cache from disk cache 真正 ...

  10. 使用docker来创建一个etcd集群

    docker run -d --name etcd1 --network etcdnet --ip 172.25.0.101 -p 23791:2379 -e ETCDCTL_API=3 -v /ro ...