SpringBoot系列: 设计Restful风格的API
RESTful 架构
REST 并非一种技术或规范, 而是一种架构风格, 如果一个架构符合Rest的约束条件和原则, 就可以称作是 RESTful 架构.
REST全称是Representational State Transfer, 省略了定语 Resource, 完整的讲法是"资源表现性状态转移", 要设计符合RESTful风格的关键是, 应始终围绕资源来分析问题.
-------------------------
1. 使用 api 作为上下文
-------------------------
上下文path建议加上 api
http://192.168.1.1/api
或者使用api作为二级域名
http://api.xxxx.com
-------------------------
2. 增加一个版本标识
-------------------------
推荐在 url 增加版本标识, 也有做法是将版本加到 http 头上
http://192.168.1.1/api/v1.1
-------------------------
3. 确定 Http method
-------------------------
[安全]特性: 1次或多次操作都不会有副作用.
[幂等]: 多次操作的结果和1次操作的结果是一致的.
GET, [安全且幂等] 代表查询资源, 相当于数据库CRUD中的 Retrieve.
GET 动作应该是幂等操作, 也就是说多次 GET 操作, 结果应该是一致的, 理论上, 我们可以使用GET完成资源创建动作, 但这样违反了GET的幂等属性.
POST, [不安全且不幂等], 代替新增资源, 相当于数据库CRUD中的 Create.
PUT, [不安全但幂等], 代表更改资源, 客户端需要提供"完整"的资源属性. 相当于数据库CRUD中全字段的Update.
PATCH, [不安全但幂等], 代表更改资源, 客户端仅提供"需要更改"的资源属性. 相当于数据库CRUD中的 Update.
DELETE, [不安全但幂等], 代表删除资源, 因为要求幂等性, 所以这里的删除应该以逻辑删除方式实现. 相当于数据库CRUD中的 Update.
-------------------------
4. 返回结果
-------------------------
针对不同操作, 服务器向用户返回的结果应该符合以下规范.
GET /collection: 返回资源对象的列表(数组)
GET /collection/resource: 返回单个资源对象
POST /collection: 返回新生成的资源对象
PUT /collection/resource: 返回完整的资源对象
PATCH /collection/resource: 返回完整的资源对象
DELETE /collection/resource: 返回一个空文档
-------------------------
5. 状态码 和 错误处理
-------------------------
服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
如果状态码是4xx, 就应该向用户返回出错信息. 一般来说, 返回的信息中将error作为键名, 出错信息作为键值即可.
{
error: "Invalid API key"
}
-------------------------
6. url 规范和示例
-------------------------
总则:
1. 尽量使用/来表示资源的层级关系, 比如 GET /zoos/ID/animals
2. 使用?追加控制参数, 而不是资源id
3. url中复合单词参数应该使用中划线或下划线, url尽量都是小写字母, 不推荐使用 lowerUpperCase 这样的写法.
4. url资源应该是名词, 操作应该由Http method指明, 而不是在url中使用 delete-user 或 create-user 字样.
5. url资源名词应该使用复数形式.
新增一个用户
POST http://192.168.1.1/api/v1.1/depts/1/users
查询用户, id为451
GET http://192.168.1.1/api/v1.1/depts/1/users/451
查询所有的用户
GET http://192.168.1.1/api/v1.1/depts/1/users
查询所有被禁的用户, 使用 ? 做过滤条件
GET http://192.168.1.1/api/v1.1/depts/1/users?disable=1
翻页查询, 增加 offset/limit 等控制参数
GET http://192.168.1.1/api/v1.1/depts/1/users?offset=1&limit=20&desc=created_at,id&asc=grade,updated_at
查询指定类型的用户
GET http://192.168.1.1/api/v1.1/depts/1/users?use-type=1
更新用户,id为451
PUT http://192.168.1.1/api/v1.1/depts/1/users/451
删除用户,id为451
DELETE http://192.168.1.1/api/v1.1/depts/1/users/451
查询两个用户, id为451和254
GET http://192.168.1.1/api/v1.1/depts/1/users/451,452
或
GET http://192.168.1.1/api/v1.1/depts/1/users/451;452
=============================
参考
=============================
http://www.ruanyifeng.com/blog/2014/05/restful_api.html
http://www.cnblogs.com/ajianbeyourself/p/3751831.html
SpringBoot系列: 设计Restful风格的API的更多相关文章
- 如何设计Restful风格的API
RestfulAPI就是由后台(SERVER端)来提供接口,前端来调用.前端调用API向后台发起HTTP请求,后台响应请求将处理结果反馈给前端.也就是说Restful 是典型的基于HTTP的协议.那么 ...
- restful风格的API
在说restful风格的API之前,我们要先了解什么是rest.什么是restful.最后才是restful风格的API! PS(REST:是一组架构约束条件和原则,REST是Roy Thomes F ...
- [01] 浅谈RESTful风格的API
1.什么是RESTful风格的API REST,即Representational State Transfer,可以理解为"(资源的)表现层状态转化". 在网络上,我们通过浏览器 ...
- Dubbo 03 Restful风格的API
目录 Dubbo03 restful风格的API 根路径 协议 版本 用HTTP协议里的动词来实现资源的增删改查 用例 swagger(丝袜哥) OpenAPI 资源 编写API文档 整合Spring ...
- PHP实现RESTful风格的API实例(三)
接前一篇PHP实现RESTful风格的API实例(二) .htaccess :重写URL,使URL以 /restful/class/1 形式访问文件 Options +FollowSymlinks R ...
- PHP实现RESTful风格的API实例(二)
接前一篇PHP实现RESTful风格的API实例(一) Response.php :包含一个Request类,即输出类.根据接收到的Content-Type,将Request类返回的数组拼接成对应的格 ...
- PHP实现RESTful风格的API实例(一)
最近看了一些关于RESTful的资料,自己动手也写了一个RESTful实例,以下是源码 目录详情: restful/ Request.php 数据操作类 Response.php 输出类 index. ...
- PHP实现Restful风格的API
Restful是一种设计风格而不是标准,比如一个接口原本是这样的: http://www1.qixoo.com/user/view/id/1表示获取id为1的用户信息,如果使用Restful风格,可以 ...
- Gin实战:Gin+Mysql简单的Restful风格的API(二)
上一篇介绍了Gin+Mysql简单的Restful风格的API,但代码放在一个文件中,还不属于restful风格,接下来将进行进一步的封装. 目录结构 ☁ gin_restful2 tree . ├─ ...
随机推荐
- 前端面试必备的css盒子模型
今天同学发给了我一份前端基础的面试题,第一道便是对css盒子模型的理解,我看到的第一眼想到的是div,然后就...懵逼了,知其然不知其所以然.所以打算写一写盒子模型的概念理解啥的,如有写的不当的地方, ...
- Jenkins+VS项目持续集成
软件安装 安装包下载连接:https://jenkins.io/download/ 安装步奏:略 账户名:admin 密码:C:\Program Files (x86)\Jenkins\secrets ...
- ios和安卓H5交互桥接
ios交互 demo1(摘自网络) <!doctype html> <html> <head> <meta charset="UTF-8" ...
- 0.[Andriod]之从零安装配置Android Studio并编写第一个Android App
0. 所需的安装文件 笔者做了几年WP,近来对Android有点兴趣,尝试一下Android开发,废话不多说,直接进入主题,先安装开发环境,笔者的系统环境为windows8.1&x64. 安装 ...
- centos 7修改时区
在线上环境遇到时间差八小时,怀疑是时区的原因: 然后再linux上运行: date 发现输出的是UTC时间,时间与现在差八个小时 然后通过以下命令去修改时区: ln -sf /usr/share/zo ...
- 在 .NET Core 中结合 HttpClientFactory 使用 Polly(下篇)
译者:王亮作者:Polly 团队原文:http://t.cn/EhZ90oq声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的(包括标题).其中可能会去除一些不影响理解但本人实在不知道如 ...
- 几行c#代码,轻松搞定一个女大学生
几行c#代码,轻松搞定一个女大学生 的作业... 哈哈,标题党了哈,但是是真的,在外面敲代码,想赚点外快,接到了一个学生的期末考试,是一个天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找 ...
- springboot项目利用Swagger2生成在线接口文档
Swagger简介. Swagger2是一款restful接口文档在线生成和在线调试工具.很多项目团队利用Swagger自动生成接口文档,保证接口文档和代码同步更新.在线调试.简单地说,你可以利用这个 ...
- jQuery 移除事件
在绑定事件的过程中,不仅可以为同一个元素绑定多个事件,也可以为多个元素绑定同一个事件.假设网页上有一个<button>元素,使用以下代码为该元素绑定多个相同的事件. <script ...
- 【转】Spark实现行列转换pivot和unpivot
背景 做过数据清洗ETL工作的都知道,行列转换是一个常见的数据整理需求.在不同的编程语言中有不同的实现方法,比如SQL中使用case+group,或者Power BI的M语言中用拖放组件实现.今天正好 ...