根据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. webpack+vue-cil跨域配置接口地址代理

    在vue项目开发的时候,接口联调的时候一般都是同域名下,且不存在跨域的情况下进行接口联调,但是当我们现在使用vue-cli进行项目打包的时候,我们在本地启动服务器后,比如本地开发服务下是 http:/ ...

  2. RocketMQ-Console安装

    1.获取源码 git clone -b release-rocketmq-console- https://github.com/apache/rocketmq-externals.git 2.进入工 ...

  3. fastJSON的常用方法总结

    fastJSON的常用方法总结 fastJSON中常用的对象是JSON,JSONArray,JSONObject三个对象.常用的方法如对象转为JSON字符串,JSON字符串转为对象,JSON字符串转为 ...

  4. 「资料分享」理解uboot要看哪些书

    最开始是看的韦东山老师的视频,确实很不错,不过总感觉是不够深入扎实,还是想自己看看书,就总结搜罗下,以供参考 学习交流可以添加 微信读者交流①群 (添加微信:coderAllen) 程序员技术交流①群 ...

  5. tensorflow tfrecoder read write

    # write in tfrecord import tensorflow as tf import os os.environ[' FLAGS = tf.app.flags.FLAGS tf.app ...

  6. nano的简单笔记

    CTRL+c 显示行数信息 ctrl + _ 到某行 alt +m 移动光标功能 alt+y 语法矫正功能

  7. (MYSQL)回表查询原理,利用联合索引实现索引覆盖

    一.什么是回表查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) InnoDB聚集索引和普通 ...

  8. P2606 [ZJOI2010]排列计数

    P2606 [ZJOI2010]排列计数 因为每个结点至多有一个前驱,所以我们可以发现这是一个二叉树.现在我们要求的就是以1为根的二叉树中,有多少种情况,满足小根堆的性质. 设\(f(i)\)表示以\ ...

  9. app开发-3

    一.Audio 模块实现开启手机摄像头 基于html5 plus http://www.html5plus.org/doc/zh_cn/audio.html 栗子:   自定义: scanQR.HTM ...

  10. 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 ...