缺点
优点
前:浏览器
后:服务器
优点
缺点
概念:前端需要增删改查,相应的每个操作后端都需要提供一个接口
Api服务器的域名要尽量在专用域名之下
建议把接口版本号维护在URL中
不常用的HTTP动词
可以让API提供参数,进行结果返回
例:(视情况而定)
?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置。
?page=2&per_page=100:指定第几页,以及每页的记录数。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1:指定筛选条件
接口返回数据,还要带上合理状态码
2开头状态码
200 OK - [GET] # 服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH] # 用户新建或修改数据成功。
202 Accepted - [*] # 表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE] # 用户删除数据成功。
4开头状态码
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] # 当创建一个对象时,发生一个验证错误。
5开头状态码
500 INTERNAL SERVER ERROR - [*] # 服务器发生错误,用户将无法判断发出的请求是否成功
API,即应用程序编程接口,接口决定了功能
API在内部预定以了函数,能够使开发人员无须明白API内部实现的机制,就能够实现某个功能
为什么要写接口文档?
API接口文档一般分为接口描述、接口地址、请求方法、请求参数、响应内容、错误代码、实例几个部分:
接口描述:简单描述接口的逻辑和作用
接口地址:网络地址
请求方法
请求参数:用来传递信息的变量。即需要请求的字段名的名称和规则:都是哪些字段,字段的类型是什么,是否必填字段等等;
相应内容:接口返回字段名称和规则
错误代码:对接口的错误用代码进行归类,以便能快速找到错误原因,解决问题;
实例:实际调用时响应的内容
前后端分离需要使用的框架
安装框架
pip install djangorestframework
注:配置setting
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # drf框架
'myapp', # 注册子应用
]
封装了很多功能
.data
解析POST、PUT、PATCH请求方式解析后的数据
.query_params
解析GET请求方式的数据
将已经序列化好的数据结合Response返回
Response(返回数据,status=状态码,template_name=None,headers=None,exception=False, content_type=None)
# 返回数据:提取出来成为Python的数据类型或者使用序列化方式处理
# headers:头部信息
# content-type:返回数据MIME类型,drf会自动根据数据进行设置
200 OK - [GET] # 服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH] # 用户新建或修改数据成功。
202 Accepted - [*] # 表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE] # 用户删除数据成功。
序列化:把ORM模型层数据返回为JSON数据集
反序列化:把前端发来的JSON数据,变为模型层数据
在子应用中创建serializers.py文件
# 序列化器
from rest_framework import serializers
class PeopleSerializer(serializers.Serializer):
# 与模型一一对应
name = serializers.CharField(max_length=20)
sex = serializers.CharField(max_length=20)
money = serializers.IntegerField()
ranking = serializers.IntegerField()
将数据转换
导包
from myapp.serializers import PeopleSerializer
class PeopleView(APIView):
def get(self,request):
people = People.objects.all()
# people是要序列化的数据 many=True 多个数据
ser = PeopleSerializer(people,many=True)
# 注意:返回的是 .data
return Response(ser.data,status=200)
建一个新的项目,配置信息(此处省略,请看之前的博客)
记得在setting中配置drf框架
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # drf框架
'myapp', # 注册子应用
]
from django.db import models
# Create your models here.
class People(models.Model):
name = models.CharField(max_length=20,verbose_name='姓名')
sex = models.CharField(max_length=20,verbose_name='性别')
money = models.IntegerField(verbose_name='身价')
ranking = models.IntegerField(verbose_name='排名')
class Meta:
db_table='people'
verbose_name = '名人表'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
在子应用中创建serializer.py文件
# 序列化器
from rest_framework import serializers
class PeopleSerializer(serializers.Serializer):
# 与模型一一对应
name = serializers.CharField(max_length=20)
sex = serializers.CharField(max_length=20)
money = serializers.IntegerField()
ranking = serializers.IntegerField()
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from myapp.models import People
from myapp.serializers import PeopleSerializer
# Create your views here.
class MyView(APIView):
def get(self,request):
print(request.query_params)
return Response({'msg':'success'},status=200)
def post(self,request):
print(request.data)
return Response({'msg':'success'},status=201)
class PeopleView(APIView):
# 查询信息
# def get(self,request):
# people = People.objects.all()
# list1 = [] # 手动序列化过程
# for i in people:
# people_dict = {
# 'name':i.name,
# 'sex':i.sex,
# 'money':i.money,
# 'ranking':i.ranking,
# }
# list1.append(people_dict)
# return Response(list1,status=200)
def get(self,request):
people = People.objects.all()
# people是要序列化的数据 many=True 多个数据
ser = PeopleSerializer(people,many=True)
# 注意:返回的是 .data
return Response(ser.data,status=200)
我采用了路由分发
from django.urls import path
from myapp import views
urlpatterns = [
path('myview/',views.MyView.as_view()),
path('people/',views.PeopleView.as_view()),
]