说明:其实没有绝对的规范,达到90%即可。

理解RESTful架构:http://www.ruanyifeng.com/blog/2011/09/restful.html

RESTful API 设计指南:http://www.ruanyifeng.com/blog/2014/05/restful_api.html

GitHub标准RESTful API:https://api.github.com/

教程收集:

http://novoland.github.io/%E8%AE%BE%E8%AE%A1/2015/08/17/Restful%20API%20%E7%9A%84%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83.html

http://imweb.io/topic/5707561f06f2400432c139a5(以下内容转自此篇文章)

http://www.coderli.com/translate-restful-standard-resolved/

http://blog.csdn.net/yue7603835/article/details/52536497

http://blog.csdn.net/u013731455/article/details/56278168

https://www.zhihu.com/question/28557115

URI

URI规范

  • 不要用大写
  • 单词间使用下划线'_'
  • 不使用动词,资源要使用名词复数形式,如:user、rooms、tickets
  • 层级 >= 三层,则使用'?'带参数

    users/1/address/2/citys (bad) /citys?users=1&address=2; (good)

Request

Method

  • GET:查询资源
  • POST:创建资源
  • PUT/PATCH

    • PUT:全量更新资源(提供改变后的完整资源)
    • PATCH:局部更新资源(仅提供改变的属性)
  • DELETE:删除资源

安全性与幂等性

  • 安全性:任意多次对同一资源操作,都不会导致资源的状态变化
  • 幂等性:任意次对同一资源操作,对资源的改变是一样的
  • Method 安全性 幂等性
    GET
    POST × ×
    PUT ×
    PATCH ×
    DELETE ×

兼容

很多客户只支持GET/POST请求,一般有两种方式模拟PUT等请求

  • 添加_method参数

    /users/1?_method=put&name=111
  • 添加X-HTTP-Method-Override请求头 (我们使用这种方式)
    X-HTTP-Method-Override: PUT

参数

Method

GET

  • 非id的参数使用'?'方式传输

    /users/1?state=closed
    POST、PATCH、PUT、DELETE
  • 非id的参数使用body传输,并且应该encode

过滤

?type=1&state=closed

排序

  • +升序,如?sort=+create_time,根据id升序
  • -降序,如?sort=-create_time,根据id降序

分页

?limit=10&offset=10
  • limit:返回记录数量
  • offset:返回记录的开始位置

单参数多字段

使用, 分隔,如

/users/1?fields=name,age,city

版本控制

三种方案:

  1. 在uri中加入版本: /v1/room/1
  2. Accept Header:Accept: v1
  3. 自定义 Header:X-Imweb-Media-Type: imweb.v1 (我们使用此方案)

自定义Media-Type参考资料github


状态码

成功

Code Method Describe
200 ALL 请求成功并返回实体资源
201 POST 创建资源成功

客户端错误

Code Method Describe
400 ALL 一般是参数错误
401 ALL 一般用户验证失败(用户名、密码错误等)
403 ALL 一般用户权限校验失败
404 ALL 资源不存在(github在权限校验失败的情况下也会返回404,为了防止一些私有接口泄露出去)
422 ALL 一般是必要字段缺失或参数格式化问题

服务器错误

CODE METHOD DESCRIBE
500 ALL 服务器未知错误

以上是常见的状态码,完整的状态码列表在这状态码

HATEOAS

在介绍HATEOAS之前,先介绍一下REST的成熟度模型

在介绍 HATEOAS 之前,先介绍一下 Richardson 提出的 REST 成熟度模型。该模型把 REST 服务按照成熟度划分成 4 个层次:

  • 第一个层次(Level 0)的 Web 服务只是使用 HTTP 作为传输方式,实际上只是远程方法调用(RPC)的一种具体形式。
  • 第二个层次(Level 1)的 Web 服务引入了资源的概念。每个资源有对应的标识符和表达。
  • 第三个层次(Level 2)的 Web 服务使用不同的 HTTP 方法来进行不同的操作,并且使用 HTTP 状态码来表示不同的结果。如 HTTP GET 方法来获取资源,HTTP DELETE 方法来删除资源。
  • 第四个层次(Level 3)的 Web 服务使用 HATEOAS。在资源的表达中包含了链接信息。客户端可以根据链接来发现可以执行的动作。

简述

HATEOAS(Hypermedia as the engine of application state)是 REST 架构风格中最复杂的约束,也是构建成熟 REST 服务的核心。它的重要性在于客户端和服务器之间的解耦。

例子

分页

request请求,查询user,每页显示10条,从第10条开始显示(第二页)

/users?limit=10&offset=10

response

{
data: {
xxxx
},
meta: {
_link: [
{rel: 'self', href: 'xxx/users?limit=10&offset=10'},
{rel: 'first', href: 'xxx/users?limit=10&offset=0', title: 'first page'},
{rel: 'last', href: 'xxx/users?limit=10&offset=50', title: 'last page'},
{rel: 'prev', href: 'xxx/users?limit=10&offset=0', title: 'prev page'},
{rel: 'next', href: 'xxx/users?limit=10&offset=20', title: 'next page'}
]
}
}

_link返回了5个资源

  • rel: 'self',资源本身
  • rel: 'first',第一页资源
  • rel: 'last',最后一页资源
  • rel: 'prev',上一页资源
  • rel: 'next',下一页资源

权限相关

如用户查询一个订单

普通用户

request

/orders/1

response

{
data: {
xxx
},
meta: {
_link: [
{rel: 'self', href: 'xxx/orders/1'},
{rel: 'related', href: 'xxx/orders/1/payment', title: 'pay the order'}
]
}
}

_link返回两个资源

  • rel: 'self',资源本身
  • rel: 'related',与当前资源相关的资源,/order/1/payment用户可以使用此资源进行支付

权限用户

request

/orders/1

response

{
data: {
xxx
},
meta: {
_link: [
{rel: 'self', href: 'xxx/orders/1'},
{rel: 'edit', href: 'xxx/orders/1', title: 'edit the order'},
{rel: 'delete', href: 'xxx/orders/1', title: 'delete the order'}
]
}
}

此用户拥有修改与删除订单的权限,因此返回了3个资源

  • rel: 'self',资源本身
  • rel: 'edit',此用户可修改该资源
  • rel: 'delete',此用户可删除该资源

常用rel

rel describe
self 资源本身,每个资源表述都一个包含此关系
edit 指向一个可以编辑当前资源的链接
delete 指向一个可以删除当前资源的链接
item 如果当前资源表示的是一个集合,则用来指向该集合中的单个资源
collection 如果当前资源包含在某个集合中,则用来指向包含该资源的集合
related 指向一个与当前资源相关的资源
first、last、prev、next 分别用来指向第一个、最后一个、上一个和下一个资源

HATEOAS总结

由以上例子可以看出_link就是以Hyperlink表述资源与资源之间的关系,这种方式使客户端与服务端能很好的分离开来,只要接口的定义不变,客户端与服务端就可以独立的开发和演变。

RESTful API设计规范收集的更多相关文章

  1. rest-framework 序列化格式Restful API设计规范

    理解RESTful架构 Restful API设计指南 理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式 ...

  2. Restful API设计规范及实战【说的比较清楚了】

    Restful API设计规范及实战   Restful API的概念在此就不费口舌了,博友们网上查哈定义文章很多,直入正题吧: 首先抛出一个问题:判断id为 用户下,名称为 使命召唤14(COD14 ...

  3. RESTful api 设计规范

    该仓库整理了目前比较流行的 RESTful api 设计规范,为了方便讨论规范带来的问题及争议,现把该文档托管于 Github,欢迎大家补充!! Table of Contents RESTful A ...

  4. 理解 RESTful API 设计规范

    RESTful是目前最流行的API设计规范,它是用于Web数据接口的设计.从字面可以看出,他是Rest式的接口,所以我们先了解下什么是Rest. REST与技术无关,它代表的是一种软件架构风格,RES ...

  5. Restful API设计规范及实战

    Restful API的概念在此就不费口舌了,博友们网上查哈定义文章很多,直入正题吧: 首先抛出一个问题:判断id为 用户下,名称为 使命召唤14(COD14) 的产品是否存在(话说我还是很喜欢玩类似 ...

  6. PHPer的项目RESTful API设计规范是怎样的?

    RESTful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计. 什么是RESTful RESTful是一种软件设计风格, 主要用于客户端与服务端交互的软件. 一般来说RESTful ...

  7. RESTful API设计规范总结

    RESTful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计. 它的大原则容易把握,但是细节不容易做对.本文总结 RESTful 的设计细节,介绍如何设计出易于理解和使用的 API. ...

  8. Restful API设计规范

    理解RESTful架构 Restful API设计指南 理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式 ...

  9. Python 之 Restful API设计规范

    理解RESTful架构 Restful API设计指南 理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式 ...

随机推荐

  1. Database coalesce

    coalesce 语法 注意:连接操作符“||”是一个值得注意的例外. 例如,空值加任何值都是空值,空值 乘任何值也都是空值,依此类推. 参数 expression 任何类型的表达式. n 表示可以指 ...

  2. 工作笔记:复制文件--从windows到ubuntu,再到fedora

    最近在测试跨平台类库,于是写了一些小程序. 当然主要利用vs进行主要的代码开发.eclipse进行linux的调试. 那么需要不时同步项目文件. 考虑到项目简单,所以没有使用svn. 1. 从wind ...

  3. 汇编2.汇编版本的helloworld

    寻址方式 立即数寻址 寄存器寻址 存储器寻址 直接寻址 : mov ax, [ 01000h ]; 直接在[]内给出一个内存地址 寄存器间接寻址: mov ax ,[si]; 在[]以寄存器的值给出内 ...

  4. 聊天室(C++客户端+Pyhton服务器)_1.框架搭设

    聊天室 一.客户端发送 用MFC可视化做个客户端登录界面. 先点击注册账号按钮,注册账号的时候就需要连接到服务器, 服务器需要查数据库,并做出相应的回应. 所以开始写C++客户端套接口类用来连接到服务 ...

  5. 关于在Qt里让程序休眠一段时间的方法总结

    出处:http://hanzhaoxin.cnblogs.com/ Qt 为何没有提供 Sleep 论坛上不时见到有人问: Qt 为什么没有提供跨平台的 sleep 函数? 使用平台相关的 Sleep ...

  6. TWaver可视化编辑器的前世今生(三)Doodle编辑器

    插播一则广告(长期有效)TWaver需要在武汉招JavaScript工程师若干要求:对前端技术(JavasScript.HTML.CSS),对可视化技术(Canvas.WebGL)有浓厚的兴趣基础不好 ...

  7. MYSQL数据库攻防与加固

    这是“官方”原本的模样搬过来的..写的很粗略啊.还有篇详细的请查看:MySQL安全加固题目及答案参考解析 启动xserver-mysql,进入xserver-mysql,开始实验,实验步骤如下: 1. ...

  8. layui二次封装

    最近一直用layui进行页面的重构,这个框架十分适合我们后台人员开发.简单易用,但是layui本身不支持双向绑定,所以很多情况下,我们在支持动态的控件加载时,需要反复刷新.这里我自己封装了一个comm ...

  9. 25. TABLESPACES , 26. TABLE_CONSTRAINTS , 27. TABLE_PRIVILEGES

    25. TABLESPACES TABLESPACES表提供有关活动MySQL Cluster表空间的信息. TABLESPACES表有以下列: TABLESPACE_NAME :表空间名称 ENGI ...

  10. 使用finalshll连接linux

    一.安装ubuntu: 我在window10上装了VMware,好像window10自带虚拟机吧;然后傻瓜式装机,装好后发现没网不知道什么原因,然后百度啪啦啪啦找了一堆,解决方法是: 然后重启下ubu ...