RESTFul API最佳实践
RESTful API 概述
基本概念
REST 英文全称:Representational State Transfer,直译为:表现层状态转移。首次是由Roy Thomas Fielding在他2000年的博士论文中提出。
REST是一种描述网络中client和server之间的资源交互方式。
而RESTful API就是完全遵循REST方式的一套API设计规范,简单来说,通过API来描述资源的访问方式:
- 通过
HTTP URL描述访问什么资源 - 通过
HTTP METHOD描述对资源的交互方式 - 通过
HTTP CODE描述资源的交互结果
幂等性
幂等性(Idempotence)本身是一个数学概念,在HTTP/1.1规范中幂等性是指
Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.
如果某个方法调用一次或多次产生的副作用是相同的,那么这个方法具有幂等性。
比如在HTTP中使用GET获取某个资源,无论调用多少次,产生的额外效果都是从服务器获取资源,所以GET方式具有幂等性。
而POST方法用于在服务器上创建一个资源,由于最终创建的结果每次都是不同的,所以POST不具有幂等性。
但是PUT方法却是幂等的,因为每次调用产生的效果都是对资源进行更新。
安全方法
安全方法是指不修改资源的 HTTP 方法。譬如,当使用 GET 或者 HEAD 作为资源 URL,都必须不去改变资源的表现形式。
注意:安全方法并不是指服务器上的资源完全不变,而是指资源的表现形式。
比如GET方法导致数据上报,关联的一些数据记录等,他实际上是改变了服务器上的某些附加资源的,但是这并不会改变资源的表现形式。
HTTP方法特性概览
| HTTP Method | 幂等性 | 安全性 |
|---|---|---|
| OPTIONS | yes | yes |
| GET | yes | yes |
| HEAD | yes | yes |
| PUT | yes | no |
| POST | no | no |
| DELETE | yes | no |
| PATCH | no | no |
RESTful API设计规则
HTTP URL
HTTP URL只用于描述访问的资源,而不应该包含对资源的交互方式。HTTP URL的Best Practice:
- 将API部署在专用的域名上,如
api.example.com - 不使用任何大写字符
- 不使用下划线
_,可使用中划线-代替来分割单词 - 参数列表要进行URL编码
- 不应该出现描述资源交互方式的动词,应尽量使用描述资源的名词
URI中的名词表示资源集合,应该使用复数形式- 应该避免资源层级太深,可以适当使用参数减少层级
- 使用斜杆
/表示资源之间的层级关系 - 在
URI的末尾避免使用/ - 避免在
URI中使用文件扩展名 - 如果有必要,需要在
URI中添加版本号标识
相应的示例如下:
// 下面列出几个bad case以及修改方法
/userPost // should use uppercase letter
-> /user-posts
/user/post // should use resource plural
-> /users/posts
/users/addPost // avoid using react verb
-> POST /users/posts
/users/posts/ // remove the last `/`
-> /users/posts
/users/posts/picture.gif // remove the extension `.gif`
-> /users/posts/picture
/users/recent_posts // use `-` replace `_`
-> /users/recent-posts
/users/posts?title=up up // param encode
-> /users/posts?name=up%20up
/users/posts/games/picture/today // avoid too deep relations
-> /users/posts/picture?type=game&time=today
/users/learning-posts // add version tag
-> /v1/users/learning-posts
补充说明:
/users/search像这个URI,虽然包含动词search,但是search并没有描述对资源的交互方式,所以这种URI也是可以的/users/posts,/user-posts这样的两个URI,第一个描述了层级关系,第二个没有,但是两个URI任然能够很明确的表示资源,并没有谁最好的说法,可以结合所在团队的命名习惯等来选取
HTTP METHOD
严格使用下面的HTTP方法来描述资源CURD操作方式,应该尽量避免在POST方式中删除资源等违背直觉的操作:
GET: 查询资源POST: 创建资源PUT: 更新资源DELETE: 删除资源
对于一些GET中一次性获取大量资源的情况下,比如获取一万个指定资源的情况,可能会出现HTTP URL超过长度限制,这个时候可以分批获取。
虽然新版的HTTP标准支持在GET请求中传送body,但是一些网络服务器并不能很好的支持,应该慎重使用。
另外对于复杂的资源获取,应该提供通用的资源筛选、排序、分页、字段选择等功能支持,并统一参数规范。例如:
Filtering:
GET /cars?color=red Returns a list of red cars
GET /cars?seats<=2 Returns a list of cars with a maximum of 2 seats
Sorting:
GET /cars?sort=-manufactorer,+model
Field selection:
GET /cars?fields=manufacturer,model,id,color
Paging:
GET /cars?offset=10&limit=5
覆盖HTTP方法
一些HTTP客户端只支持GET和POST请求。为了能够加强这些客户端的访问能力,API需要能够覆盖HTTP方法。
尽管这里没有任何强制的标准,但流行的做法是API会接收一个请求头X-HTTP-Method-Override,它的值可以是PUT、PATCH或者DELETE三者之一。
注意,用来覆盖HTTP方法的header只能在POST请求中被接受。GET请求永远不能修改服务器上的数据。
HTTP RESPONSE
关于HTTP请求的返回值,有以下几点Best Practice:
- 采用格式化返回数据,推荐
json - 充分利用HTTP状态码来描述错误类型
- 规范返回数据的统一格式,以及细分错误类型和提示
- 应该尽量返回有用的错误信息和提示,唯一的错误码
常用的HTTP状态码:
200OK - 对成功的GET、PUT、PATCH或DELETE操作进行响应。也可以被用在不创建新资源的POST操作上201Created - 对创建新资源的POST操作进行响应。应该带着指向新资源地址的Location header)204No Content - 对不会返回响应体的成功请求进行响应(比如DELETE请求)304Not Modified - HTTP缓存header生效的时候用400Bad Request - 请求异常,比如请求中的body无法解析401Unauthorized - 没有进行认证或者认证非法。当API通过浏览器访问的时候,可以用来弹出一个认证对话框403Forbidden - 当认证成功,但是认证过的用户没有访问资源的权限404Not Found - 当一个不存在的资源被请求405Method Not Allowed - 所请求的HTTP方法不允许当前认证用户访问410Gone - 表示当前请求的资源不再可用。当调用老版本API的时候很有用415Unsupported Media Type - 如果请求中的内容类型是错误的422Unprocessable Entity - 用来表示校验错误429Too Many Requests - 由于请求频次达到上限而被拒绝访问
参考文档
- https://en.wikipedia.org/wiki/Representational_state_transfer
- https://restfulapi.net/resource-naming/
- https://docs.microsoft.com/en-us/azure/architecture/best-practices/api-design
- https://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/
- https://blog.florimond.dev/restful-api-design-13-best-practices-to-make-your-users-happy
RESTFul API最佳实践的更多相关文章
- 我所理解的Restful API最佳实践
一直在公司负责API数据接口的开发,期间也遇到了不小的坑,本篇博客算是做一个小小的记录. 1. 不要纠结于无意义的规范 在开始本文之前,我想先说这么一句:RESTful 真的很好,但它只是一种软 ...
- 我所认为的RESTful API最佳实践
我所认为的RESTful API最佳实践 不要纠结于无意义的规范 在开始本文之前,我想先说这么一句:RESTful 真的很好,但它只是一种软件架构风格,过度纠结如何遵守规范只是徒增烦恼,也违背了使用它 ...
- REST与RESTFul API最佳实践
我经常会面试一些做PHP的开发者,让我很奇怪的是,10个人总有8个多不知道什么是REST服务,甚至是没有听说过.但RESTFul API已经是现在互联网里对外开放接口的主流模式,可参考: 豆瓣API ...
- Restful Api 最佳实践
Web APIs has become an very important topic in the last year. We at M-Way Solutions are working ever ...
- RESTful API 最佳实践(转)
原文:http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html 阮一峰老师的文章,他的文章把难懂的东西讲的易懂 RE ...
- Restful API 最佳实践 (理论篇)
参考: http://www.ibm.com/developerworks/cn/web/1103_chenyan_restapi/ 规划好 资源标示结构 和 URI模式, 是API设计成功的关键 原 ...
- RESTful API 最佳实践----转载阮一峰
文章地址http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html
- 我们必须要知道的RESTful服务最佳实践
看过很多RESTful相关的文章总结,参齐不齐,结合工作中的使用,非常有必要归纳一下关于RESTful架构方式了,RESTful只是一种架构方式的约束,给出一种约定的标准,完全严格遵守RESTful标 ...
- ASP.NET Core Web API 最佳实践指南
原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...
随机推荐
- Maven 梳理 - 常用三种archetype说明
archetype:原型的意思,可理解为Maven项目模板工具包 常用archetype 1.cocoon-22-archetype-webapp 2.maven-archetype-quicksta ...
- redis-分片(转)
转:https://www.cnblogs.com/houziwty/p/5167075.html 分片(partitioning)就是将你的数据拆分到多个 Redis 实例的过程,这样每个实例将只包 ...
- 阿里云服务器CentOS6.9安装maven
1.下载maven http://maven.apache.org/download.cgi 2.移动到linux yangyuke用户下(此处由于我设置进入linux的是自定义用户yangyuke, ...
- 正睿国庆DAY2动态规划专题
正睿国庆DAY2动态规划专题 排列-例题 1~n 的排列个数,每个数要么比旁边两个大,要么比旁边两个小 \(f[i][j]\) 填了前i个数,未填的数有\(j\)个比第\(i\)个小,是波峰 \(g[ ...
- 【柠檬班】史上最简单的Jmeter跨线程组取参数值的两种办法(不写代码)【原创】
如果你工作中已经在用jmeter做接口测试,或性能测试了,你可能会遇到一个麻烦,哪就是jmeter的变量值不能跨线程组传递. 看,官方就已经给出了解释.这个不是jmeter的缺陷,这是jmeter ...
- 利用JVM在线调试工具排查线上问题
在生产上我们经常会碰到一些不好排查的问题,例如线程安全问题,用最简单的threaddump或者heapdump不好查到问题原因.为了排查这些问题,有时我们会临时加一些日志,比如在一些关键的函数里打印出 ...
- .NET斗鱼直播弹幕客户端(下)
.NET斗鱼直播弹幕客户端(下) 在上篇文章中,我们提到了如何使用.NET连接斗鱼TV直播弹幕的基本操作.然而想要做得好,做得容易扩展,就需要做进一步的代码整理. 本文将涉及以下内容: 介绍如何使用R ...
- 无意间做了个 web 版的 JVM 监控端(前后端分离 React+Spring Boot)
之前写了JConsole.VisualVM 依赖的 JMX 技术,然后放出了一个用纯 JMX 实现的 web 版本的 JConsole 的截图,今天源码来了. 本来就是为了更多的了解 JMX,第一步就 ...
- 做高逼格程序员之说走就走的「Linux To Go 」
简介:想拥有一个Linux,在自己的电脑上安装双系统太麻烦.想和WTG一样,随插随用. 使用LTG的好处 安装.修复系统:配置好后的Linux系统极其强大. 工作中我们同样可以使用这个系统,回到家里插 ...
- Spring Boot (十四): 响应式编程以及 Spring Boot Webflux 快速入门
1. 什么是响应式编程 在计算机中,响应式编程或反应式编程(英语:Reactive programming)是一种面向数据流和变化传播的编程范式.这意味着可以在编程语言中很方便地表达静态或动态的数据流 ...