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.它的出现改变了 ...
随机推荐
- webpack+vue-cil跨域配置接口地址代理
在vue项目开发的时候,接口联调的时候一般都是同域名下,且不存在跨域的情况下进行接口联调,但是当我们现在使用vue-cli进行项目打包的时候,我们在本地启动服务器后,比如本地开发服务下是 http:/ ...
- RocketMQ-Console安装
1.获取源码 git clone -b release-rocketmq-console- https://github.com/apache/rocketmq-externals.git 2.进入工 ...
- fastJSON的常用方法总结
fastJSON的常用方法总结 fastJSON中常用的对象是JSON,JSONArray,JSONObject三个对象.常用的方法如对象转为JSON字符串,JSON字符串转为对象,JSON字符串转为 ...
- 「资料分享」理解uboot要看哪些书
最开始是看的韦东山老师的视频,确实很不错,不过总感觉是不够深入扎实,还是想自己看看书,就总结搜罗下,以供参考 学习交流可以添加 微信读者交流①群 (添加微信:coderAllen) 程序员技术交流①群 ...
- tensorflow tfrecoder read write
# write in tfrecord import tensorflow as tf import os os.environ[' FLAGS = tf.app.flags.FLAGS tf.app ...
- nano的简单笔记
CTRL+c 显示行数信息 ctrl + _ 到某行 alt +m 移动光标功能 alt+y 语法矫正功能
- (MYSQL)回表查询原理,利用联合索引实现索引覆盖
一.什么是回表查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) InnoDB聚集索引和普通 ...
- P2606 [ZJOI2010]排列计数
P2606 [ZJOI2010]排列计数 因为每个结点至多有一个前驱,所以我们可以发现这是一个二叉树.现在我们要求的就是以1为根的二叉树中,有多少种情况,满足小根堆的性质. 设\(f(i)\)表示以\ ...
- app开发-3
一.Audio 模块实现开启手机摄像头 基于html5 plus http://www.html5plus.org/doc/zh_cn/audio.html 栗子: 自定义: scanQR.HTM ...
- CentOS7.6编译安装redis5.0
yum install gcc wget http://download.redis.io/releases/redis-5.0.0.tar.gz tar xvf redis-5.0.0.tar.gz ...