restful规范是一套主流的API规范,目的是将前后端统一规范。节省二者的沟通成本, 提高开发效率,常见的规范有以下9种

1.https协议

在实际项目部署中,使用https协议代替http,目的是为了让接口更加安全

当然https在项目开发中是不相关的

2.域名

对于后端的开发人员,在实现接口的时候,尽可能在域名上加上api的标识,如:

https://api.example.com
https://www.example.com/api/

 

 

 

3.版本

对于后端开发人员,API要体现出来版本,便于后期进行版本的管理

https://api.example.com/v1/
https://v1.api.example.com/
https://www.example.com/api/?version=1.1
或者放在请求头中
...

 

4.路径

restful规范中认为网络上的一切都是资源,针对资源可以进行增删改查的操作。URL重要使用名词,使用请求方法进行动作上的区分

https://api/users/v1/             GET方法           用户列表
https://api/users/v1/            POST方法          添加用户
https://api/users/(\d+)/v1/       GET方法           获取单条数据
https://api/users/(\d+)/v1/       DELETE方法        删除单条数据
https://api/users/(\d+)/v1/       PUT方法           更新单条全部数据
https://api/users/(\d+)/v1/ PATCH方法 更新单条局部数据

 

5.请求方法

根据方法不同进行不同的操作

GET:   在服务器获取资源(一项或者多项)
POST:  在服务器新建一个资源
PUT:   在服务器上更新资源
PATCH: 在服务器上局部更新资源
DELETE:在服务器上删除资源

 

6.搜索条件

在URL中通过参数的形式携带搜索条件,常用GET方法

https://api.example.com/v1/users?limit=10                指定返回的数据数量
https://api.example.com/v1/users?offset=10               返回指定记录的其实位置
https://api.example.com/v1/users?page=2&per_page=10      指定第几页以及每页的数量

 

 

7.相应数据

针对不同的操作,服务器响应的结果是有所不同的

URL  方法  描述 返回的数据
/users/ GET 获取数据列表 [{’name‘:'victor'},{'name':'大山'}]
/users/ POST 添加数据 返回新添加的数据对象{’name‘:'victor'},
/users/(\d+)/ GET  获取单条数据 {’name‘:'victor'}
/users/(\d+)/ DELETE  删除数据 返回一个空对象
/users/(\d+)/ PUT 更新数据 返回更新后的数据{’name‘:'victor'}
/users/(\d+)/ PATCH 局部更新 返回更新后的数据{’name‘:'victor'}

 

 

 

 

 

当然上面也不会是绝对的,每个公司都会根据自己的业务需求进行适当的调整

8.状态码

API接口除了数据以外,还会携带一些状态码,表示请求的状况,状态码也是公司自行设定的

{
    code:400,
    error:'xxx'
}

 

9.错误处理

当后端响应请求的时候,如果发生错误,也需要将错误返回给客户端

{
    code:400,
    error:'xxx'
}

 

10.案例

该案例仍然是使用Django的写法

路由:

from django.contrib import admin
from django.urls import path
from student import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('users/<str:version>/students', views.showUsers),
    path('users/<str:version>/students/<int:pk>', views.showUsers),
]

 

视图函数

 1 from django.shortcuts import render
 2 from django.http import JsonResponse
 3 
 4 
 5 # Create your views here.
 6 def showUsers(request, version, pk=None):
 7     # 获取版本
 8     print(version)
 9     # 没有用户ID
10     if not pk:
11         if request.method == "GET":
12             print('获取用户列表')
13             data = {
14                 'code': 0,
15                 'data': [
16                     {
17                         'id': 1, 'name': 'kunmzhao'
18                     },
19                     {
20                         'id': 2, 'name': 'victor'
21                     },
22                     {
23                         'id': 3, 'name': '大山'
24                     },
25                 ]
26             }
27         elif request.method == "POST":
28             # 从请求体中获取数据,添加导数据库
29             data = {
30                 'code': 0,
31                 'data': {'id': 4, 'name': 'jerry'}
32             }
33         else:
34             data = {
35                 'code': 100,
36                 'error': '请求错误'
37             }
38     else:
39         if request.method == "GET":
40             # 获取pk对应的用户数据
41             data = {
42                 "code": 0,
43                 "data": [{"id": 3, "name": 'kunmzhao'}],
44             }
45         elif request.method == "DELETE":
46             # 删除指定pk下的用户
47             data = {
48                 "code": 0,
49             }
50         elif request.method == 'PUT':
51             # 更新数据到数据库
52             data = {
53                 "code": 0,
54                 "data": [{"id": 4, "name": 'sunny'}],
55             }
56         elif request.method == "PATCH":
57             # 更新数据到数据库
58             data = {
59                 "code": 0,
60                 "data": [{"id": 5, "name": 'wind'}],
61             }
62         else:
63             data = {
64                 "code": 400,
65                 "error": "请求错误",
66             }
67     return JsonResponse(data)

 

在上面的案例中我们使用的是Django中的FBV写法,使用CBV写法如下

路由

from django.urls import path
from web import views

urlpatterns = [
    path("api/<str:version>/students/", views.Users.as_view()),
    path("api/<str:version>/students/<int:pk>", views.Users.as_view()),
]

 

视图

from django.http import JsonResponse
from django.views import View


class Users(View):
    def get(self,request, version, pk=None):
        if not pk:
            # 获取用户列表
            info = {
                "code": 0,
                "data": [{"id": 1, "name": 'kunmzhao'}],
            }
            return JsonResponse(info)
        # 获取pk对应的用户数据
        info = {
            "code": 0,
            "data": [{"id": 3, "name": 'victor'}],
        }
        return JsonResponse(info)

    def post(self, request,version):
        # 新增用户,将用户添加到数据库中
        info = {
            "code": 0,
            "data": [{"id": 2, "name": 'victor'}],
        }
        return JsonResponse(info)

    def delete(self, request,version,pk):
        # 删除指定pk下的用户
        info = {
            "code": 0,
        }
        return JsonResponse(info)

    def put(self, request,version,pk):
        # 更新数据到数据库
        info = {
            "code": 0,
            "data": [{"id": 4, "name": 'sunny'}],
        }
        return JsonResponse(info)

    def patch(self, request, version, pk):
        # 更新数据到数据库
        info = {
            "code": 0,
            "data": [{"id": 5, "name": 'wind'}],
        }
        return JsonResponse(info)

 

posted on 2022-11-09 21:07  阿明明  阅读(97)  评论(0编辑  收藏  举报