Django-RESTful Api设计风格
协议
- API与用户的通信协议总是使用HTTPS协议
域名
- 尽量将API部署在专用域名下:
https://api.sunck.wang
- 如果API比较简单,不会有进一步的扩展,可以考虑放在主域名下:
http://www.sunck.wang
版本
- 应该将API的版本放入URL
- 将版本放到HTTP头信息
路径
- 表示API的具体网址
- 每一个网址代表一种资源,所以网址中不能有动词,只能是名词,而且所有的名词往往与数据库的表名对应。
- 获取所有的学生:
- 错误路径:
https://www.sunck.wang/getStudents
- 正确路径:
https://www.sunck.wang/students
- 错误路径:
使用正确的HTTP请求方法
-
HTTP请求方法(SQL命令)
GET(SELECT)
:从服务器获取一个或多个资源POST(CREATE)
:在服务器新建一个资源PUT(UPDATE)
:在服务器更新资源,客户端提供改变后的完整资源PATCH(UPDATE)
:在服务器更新资源,客户端提供改变的属性DELETE(DELETE)
:从数据库删除资源- HEAD
- OPTIONS
-
示例:
-
列出所有学生:
1
GET https://www.sunck.wang/students
-
获取某个指定编号的学生:
1
GET https://www.sunck.wang/students/ID
-
获取某个指定编号班级的所有学生:
1
GET https://www.sunck.wang/grades/ID/students
-
创建一个学生:
1
POST https://www.sunck.wang/students
-
更新某个指定编号的学生信息(提供该学生的所有信息):
1
PUT https://www.sunck.wang/students/ID
-
更新某个指定编号的学生信息(提供该学生的部分信息):
1
PATCH https://www.sunck.wang/students/ID
-
删除某个指定编号的学生:
1
DELETE https://www.sunck.wang/students/ID
-
过滤信息
-
如果资源数据较多,服务器不能将所有的数据一次性全部返回给客户端。API应该提供参数,过滤返回结果。
-
示例:
-
指定返回记录的数量:
1
GET https://www.sunck.wang/students?limit=
-
指定返回记录的开始位置:
1
GET https://www.sunck.wang/students?offset=
-
指定返回第几页的数据,以及每页的记录数:
1
GET https://www.sunck.wang/students?page=&per_page=
-
指定返回结果以哪个属性排序,以及排序方式
1
GET https://www.sunck.wang/students?sort=&order=
-
指定筛选条件
1
GET https://www.sunck.wang/students?student_gt_age=20
1
GET https://www.sunck.wang/students?id=5
-
-
**注意:**参数的设计允许存在冗余,即允许API路径和URL参数偶尔有重复
1
GET https://www.sunck.wang/students/ID?id=20
状态码
-
**作用:**服务器向用户返回的状态和提示信息
状态码 描述 请求 含义 200 OK GET 服务器成功返回用户请求的数据 201 Created POST、PUT、PATCH 用户新建或修改数据成功 202 Accepted * 表示请求已进入后台队列 204 No Content DELETE 用户删除数据成功 400 Bad Request POST、PUT、PATCH 用户发出的请求有错误 401 Unauthorized * 用户没有权限(令牌、用户名、密码错误) 403 Forbidden * 表示用户得到授权(与401相对),但是访问是被禁止的 404 Not Found * 请求针对的是不存在的记录 406 Not Acceptable GET 用户请求的格式不可得(比如用户请求JSON格式数据,但是只有XML格式) 410 Gone GET 用户请求的资源被永久删除,且不会再得到 422 Unprocessable Entity POST、PUT、PATCH 创建一个对象时,发生一个验证错误 500 Internal Server Error 服务器发生错误 *表示任何请求都可以
错误处理
-
如果状态码是4xx,就应该向用户返回出错信息。返回的信息中一般将error作为键,出错的信息作为值
1
2
3{
"error": 错误信息,
}
响应结果
- **概述:**针对不同的操作,服务器向用户反回的结果应该符合规范
- **
GET /students
:**返回资源对象的列表 - **
GET /students/ID
:**返回单个资源对象 - **
POST /students
:**返回新生成的完整的资源对象 - **
PUT /students/ID
:**返回新完整的资源对象 - **
PATCH /students/ID
:**返回新完整的资源对象 - **
DELETE /students/ID
:**返回一个空文档
使用链接关联相关的资源
-
**概述:**返回结果中提供了链接,链向了其他API方法,使用户不查阅文档,也知道下一步应该做什么
-
示例:
1
2
3
4
5
6
7[
{
"img":"http://www.sunck.wang/static/media/a.jpg"
"detail":12343
"name":"招商引资"
},
]1
2
3
4
5
6
7
8
9
10
11
12[
{
"link":{
"rel":"collection http://www.sunck.wang",
"href":"http://www.sunck.wang/static/media/a.jpg",
"title":"lunbotu",
"type":"image/png",
},
"detail":12343
"name":"招商引资"
},
] -
键:
rel
:表示这个API与当前网址的关系href
:表示API的路径title
:表示API的标题type
:表示返回类型