HTTP APIs 设计/规范指南
根据REST APIs的成熟度模型 ,此规范关注的是Level 2
的APIs。
1 设计指南
HTTP APIs主要由四部分组成:HTTP
,URL
,资源
,资源的表述(JSON)
。资源的表述格式通常都采用JSON
,故而后面就使用JSON
代指资源的表述
。根据这些组成部分,按照以下3个步骤设计APIs:
- 基于
资源
设计APIs。 - 基于
URL
标识资源
。 - 基于
JSON
和HTTP
操作URL
标识的资源
。
1.1 基于资源
设计API
设计HTTP APIs的首要任务是识别出业务领域中存在的资源。资源是对服务端提供的服务进行分解、组合后的一个被命名的抽象概念。
有一个很重要的点需要明确一下:资源≠数据表,它们两个之间并没有直接的映射关系。如果直接把数据存储结构映射为资源,则只会让资源无法有效的表达业务需要,也会造成资源本身和底层存储的紧耦合。
资源的设计是以名词
为中心的。比如今天的天气
是一个资源;而获取今天的天气
则不是,它代表的是对今天的天气
资源的一个读取操作。基于此我们可以抽象出来一个天气
的资源。
1.2 基于URL
标识资源
识别出资源
后,则需要为其分配一个URL
进行标识。
- 一个
资源
可以有多个URL
。 - 一个
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 基于JSON
和HTTP
操作URL
标识的资源
在标识出资源
以后,就可以使用HTTP
通过JSON
来操作资源了。
- 使用
HTTP Method
来映射对资源的操作请求(CRUD或者其他)。 - 使用
HTTP Header
携带请求/响应所需的元数据信息。 - 使用
HTTP Stauts Code
代表HTTP协议层面
的响应状态。 - 使用
JSON
作为数据交换格式。
2 规范指南
2.1 通用部分
2.2 API版本化
在Level 2
的HTTP APIs中,虽然我们推荐也努力使得我们的APIs不做不兼容的改动,但是依然无法彻底的避免不兼容的升级。这就使得我们不得不进行对APIs进行版本管理。通常有以下3种方案:
- URL
GET http://api.linianhui.com/v1/resources HTTP/1.1
- Request Header
GET http://api.linianhui.com/resources HTTP/1.1
Api-Version: v1 - 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 Code
有4xx
和5xx
的状态码来表示哪里出错了,但是其代表的只是HTTP协议层面
的错误描述,它无法提供和业务相关的更具体错误描述。基于此种情况,我们需要设计一套描述业务层面错误的数据结构:
[
{
"error": "user_name",
"message": "用户名不能为空。"
},
{
"error": "age",
"message": "用户年龄不能小于0。"
}
]
- 这个数据结构仅在状态码为
4xx
和5xx
出现的时候才会使用;2xx
的时候则不包含此数据结构。 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-01
和2018-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.)论文。
- 英文版: https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
- 中文版: http://www.infoq.com/cn/minibooks/web-based-apps-archit-design
- 本人的解读REST系列博客:http://www.cnblogs.com/linianhui/category/774322.html
HTTP APIs 四大组成部分(HTTP,URI,MIME,JSON)
- HTTP/1.1 ( RFC7230-7235 ) :https://tools.ietf.org/html/rfc7230
- URI ( RFC 3986 ) :https://tools.ietf.org/html/rfc3986
- MIME ( RFC 2387 ):https://tools.ietf.org/html/rfc2387
- JSON : http://json.org/
Hypermedia
- JSON Schema: http://json-schema.org/
URL模板
- URI Template ( RFC6570 ) :https://tools.ietf.org/html/rfc6570
时间日期格式化
- Date and Time Formats - ISO 8601:https://www.w3.org/TR/NOTE-datetime
- Date and Time on the Internet: Timestamps ( RFC 3339 ) :https://tools.ietf.org/html/rfc3339#section-5.6
国际化
- https://www.iso.org/iso-3166-country-codes.html
- https://www.iso.org/iso-4217-currency-codes.html
- https://www.iso.org/iso-639-language-codes.html
REST APIs 成熟度模型:https://martinfowler.com/articles/richardsonMaturityModel.html
HTTP APIs 设计/规范指南的更多相关文章
- ASIC设计-终极指南
ASIC设计-终极指南 ASIC Design – The Ultimate Guide ASIC设计-终极指南 ASICs代表特定于应用的集成电路,指的是针对特定应用而设计的半导体解决方案,与其他解 ...
- JavaScript编码规范指南
前言 本文摘自Google JavaScript编码规范指南,截取了其中比较容易理解与遵循的点作为团队的JavaScript编码规范. JavaScript 语言规范 变量 声明变量必须加上 var ...
- atitit.api设计 方法 指南 手册 v2 q929.docx
atitit.api设计 方法 指南 手册 v2 q929.docx atitit.api设计原则与方法 1. 归一化(锤子钉子理论)1 1.1. 链式方法2 1.2. 规则5:建立返回值类型2 1. ...
- MarkDown编写规范指南
Markdown 编写规范指南 简介: Markdown的目标是实现「易读易写」,成为一种适用于网络的「书写语言」. 一份使用Markdown格式撰写的文件可以直接以纯文本发布,它的最大灵感来源其实是 ...
- OC 开发规范指南 - 个人见解写的很好
纽约时报 移动团队 Objective-C 规范指南 这份规范指南概括了纽约时报 iOS 团队的代码约定. 介绍 关于这个编程语言的所有规范,如果这里没有写到,那就在苹果的文档里: • Objecti ...
- 最全面的 Android 编码规范指南
最全面的 Android 编码规范指南 本文word文档下载地址:http://pan.baidu.com/s/1bXT75O 1. 前言 这份文档参考了 Google Java 编程风格规范和 Go ...
- #Google HTML&CSS规范指南
Google HTML&CSS规范指南 翻译自原文 目录 Google HTML&CSS规范指南 1. 背景 2. 通用 2.1 通用样式规则 2.1.1 协议 2.2 通用格式规则 ...
- 字节跳动前技术总监开源分享《Android架构设计权威指南》,YYDS!
架构就像是一场进化史,根据不同时期的需求,演变出不同的架构,车轮滚滚,到今天,移动端框架百花齐放,让人目不暇接.但是其中的本质是磨灭不了的,换言之根本没有磨灭而是隐藏到了人们所看不到的地方,但是依旧发 ...
- Git常用命令和Git团队使用规范指南
转自:https://wsgzao.github.io/post/git/ 前言 在2005年的某一天,Linux之父Linus Torvalds 发布了他的又一个里程碑作品——Git.它的出现改变了 ...
随机推荐
- 工厂交接班易出问题?MES系统实现精准对接
工厂交接班制度非常的严格和复杂,而MES系统能让繁琐的交接班流程简单快捷无措.MES系统在发生事件时记录传递事件,还可以主动对事件进行分类和报告.人员可以查看和深入到以前或当前班次的个别事件. 随着工 ...
- FreeRTOS软件定时器
API函数 //创建 TimerHandle_t xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriod ...
- centos7 上Docker安装与启动
1. docker centos 文档地址 https://docs.docker.com/install/linux/docker-ce/centos/ 2. 安装环境说明: docker社区版 ...
- CentOS8-在hyper-V安装选项
安装选项select Server with a GUI.后重启卡在黑屏无法启动. 后改选: Select software to be installed. Choose the Workstat ...
- SQL SERVER- waitresource解读
例如: OBJECT: 18:1769220894:8 第一个是dbid:18,第二个是objectid:1769220894,第三个是indexID:8 SELECT DB_NAME(18)SELE ...
- HashMap不足性分析
不足性: 1.缺陷就在于其高度依赖hash算法,如果key是自定义类,你得自己重写hashcode方法,写hash算法. 而且hashmap要求,存入时的hashcode什么样,之后就不能在变更,如果 ...
- HashMap扩容死循环问题
原文:https://blog.csdn.net/Leon_cx/article/details/81911223 下面我们来模拟一下多线程场景下扩容会出现的问题: 假设在扩容过程中旧hash桶中有一 ...
- 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. ...
- memoryCache 和 diskCache 的相关总结
一.缓存位置 在浏览器开发者工具的 Network 的 Size 栏会出现的三种情况: from Service Worker from memory cache from disk cache 真正 ...
- 使用docker来创建一个etcd集群
docker run -d --name etcd1 --network etcdnet --ip 172.25.0.101 -p 23791:2379 -e ETCDCTL_API=3 -v /ro ...