api接口规范/DRF基本使用/序列化
Web应用模式
1.前后端不分离
客户端看到的内容和所有页面效果都是有一个服务器提供的。后端代码和前端代码都是一起返回的
前后端分离
把前端页面效果前端的代码单独分离到一个服务器或目录下面[html css js] 后端只需要返回数据即可,前端是一个独立的网站或地址,后端也是一个独立的网站。
优点:后端只需要一份代码可以对接多种web ios 安卓等前端应用
api接口/规范
应用程序编程接口,应用程序对外提供了一个操作数据的入口,这个入口可以是一个函数或类方法,也可以是一个url地址或网络地址,当客户端调用这个入口,应用程序则会执行对应的代码给客户端完成对应的功能。
api接口也是工作中常见的开发内容,我们也会调用别人编写好的api接口,我们也会编写api接口给别人调用操作。由于是api接口共多人使用,所以需要有一个明确的编写规范
api接口规范目前流行的有2种:restful,RPC
RPC:远程过程调用,访问远程服务端提供的api接口,这种接口一般以服务或过程式代码提供
服务端提供一个唯一的访问入口地址:
eg:http://api.xxxx.com 或 http://www.xxx.com/api
一般以这两种地址为开头
然后通过post请求来把客户端的动作提交到服务端处理
通过请求体携带的字符串参数表达动作的具体意义
-https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295®ion=上海&query=肯德基&output=json
例如:
url地址:https://api.map.baidu.com/
请求方式:get/post/delete/put等
请求动作:place/v2/search
# 后端通过动作确定要调用的接口名称
请求参数:region=上海 query=肯德基
# 给对应要执行的接口传递参数
响应结果:output=json
# 返回一个json格式的结果
优点:因为单一入口,所以更容易实现一些垂直业务 类似完成权限,限流等 rpc直接通过请求体或查询参数表达对服务端的操作,相对比较直观 一目了然
缺点:当rpc接口多了,客户端请求服务端api接口时会比较难找,可能会导致接口重复 接口调用混乱
restful规范:资源状态转换(表征性状态转移)
rest全称是Representational State Transfer,是一种定义api接口的设计风格,尤其适用在前后端分离的应用模式中。
把服务器提供的所有数据/文件都看成资源,api接口请求数据的操作,本质上就是对资源的操作
客户端无非就是对服务端的资源去做操作,例如 添加/删除/修改 其实都是对资源状态的转换
restful规范要求:
1.数据安全保障:通常使用https(http+ssl/tsl)协议
url链接一般都是采用https协议进行传输
采用https协议可以提高数据交互过程中的安全性
2.接口的特征:接口中带api标识
https://api.baidu.com/books
https://www.baidu.com/api/books
3.多版本共存:url路径中带版本信息
https://api.baidu.com/v1/books
https://www.baidu.com/api/v2/books
4.数据及是资源,均尽量使用名词 url中直接体现
https://www.baidu.com/api/users
https://www.baidu.com/api/books
#一般可以根据用户要操作的表命名
5.对数据的操作由请求方式决定 常规规范
https://www.baidu.com/api/books get请求 查询所有图书
https://www.baidu.com/api/books/1 get请求 查询id为1的图书
https://www.baidu.com/api/books post请 新增数据
https://www.baidu.com/api/books put请求 修改数据
https://www.baidu.com/api/books delete请求 删除数据
6.在url请求地址中带过滤条件
https://www.baidu.com/api/books?name=红楼梦
https://www.baidu.com/api/books?price=99&number=1001
7.响应体中中需要携带自定义响应状态码
http本身响应状态码:1xx请求正在处理/2xx成功响应/3xx重定向
/4xx客户端的错误/5xx服务端的错误
自定义状态码由公司规范决定 eg:100,101,102,103
{"code":100}或{"status":100}
8.返回数据中携带信息
{
"code":100
"message":"ok"
}
{
"code":101
"message":"账号或密码错误"
}
9.返回的结果应该符合规范
GET获取数据:返回数据对象列表 [{"name":moon123,"psd":123123},{"name":moon222,"psd":11111}]
GET获取单个对象:返回单个数据对象{"name":moon123,"psd":123123}
POST新增对象:返回新生成的数据对象
PUT修改数据:返回修改后的 数据对象
DELETE:返回一个文档
10.响应数据中带连接
{
"code":100
"message":"ok"
"img":"https://www.baidu.com/api/红楼梦.png"
}
restful是多入口,以资源为主的api接口规范,restful接口名上体现的资源名以名词表达
通过不同请求来判断动作
eg:http:api.xxx.com/students/
rpc是单入口,以动作为主的api接口规范,在url上体现的是动作名,
rpc的接口名称名一般是有有动作名和附带操作数据的参数
eg:http:api.xxx.com/?action=create_student/&sex=1&age=22
postman接口测试工具
写好接口后都需要自己通过测试后再给别人使用
postman基本使用说明
序列化与反序列化
api接口开发最核心最常见的常见的过程就是序列化,序列化就是数据转换
序列化有2个阶段 序列化 反序列化
序列化:把我们能识别的数据转换为指定格式给别人 - read
把django中的数据对象/字典/列表-- 序列化过程 --json格式(前端可以识别json字符串)
后端查询到的数据 给到前端的过程就需要序列化 (查询接口)
反序列化:把我们不能识别的数据转为我们可以操作的数据 - write
把前端给的数据转换为我们需要的格式,变为模型类对象,前端一般大多数给我们json格式
把前端给的数据保存到后端就需要反序列化 (新增接口,修改接口)
基于django原生编写5个接口
5个接口
查询所有:
class BookView(View):
def get(self, request):
# 拿出所有图书对象
books = Book.objects.all()
# 把queryset转为列表然后把json格式给到前端
book_list = []
for book in books:
book_list.append({'name': book.name, 'price': book.price, 'publish': book.publish})
return JsonResponse(book_list, safe=False, json_dumps_params={'ensure_ascii': False})
新增一个:
def post(self, request):
name = request.POST.get('name')
price = request.POST.get('price')
publish = request.POST.get('publish')
books = Book.objects.create(name=name, price=price, publish=publish)
return JsonResponse(
{'name': books.name, 'price': books.price, 'publish': books.publish, 'code': 100, 'message': '创建成功'})
查询一个:
更改路由 传递参数
path('api/v1/books/<int:id>', views.BookOneView.as_view()),
class BookOneView(View):
def get(self,request,id):
books = Book.objects.filter(pk=id).first()
return JsonResponse({'id':books.pk,'name': books.name, 'price': books.price, 'publish': books.publish})
删除一个:
def delete(self,request,id):
Book.objects.filter(pk=id).first().delete()
return JsonResponse({'code':101,'message':'删除成功'})
修改一个:
def put(self, request, id):
books = Book.objects.filter(pk=id).first()
book_dict = json.loads(request.body)
# 前端传递json格式数据 都在request.body中 并 需要反序列化
name = book_dict.get('name')
price = book_dict.get('price')
publish = book_dict.get('publish')
# 拿到前端传递的数据
if name:
books.name = name
if price:
books.price = price
if publish:
books.publish = publish
books.save()
return JsonResponse({'id': books.pk, 'name': books.name, 'price': books.price, 'publish': books.publish,
'message': '修改成功'})
drf介绍和快速使用
drf全称 djangorestframework 属于一个框架
可以帮助我们快速实现符号restful规范的接口
安装djangorestframework
建议使用django版本3.x
1.创建一个serializer.py文件
文件内编写
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
2.在view中
from rest_framework.viewsets import ModelViewSet
from .serializer import BookSerializer
# 导入对应模块
class BookView(ModelViewSet):
#继承该模块
queryset = Book.objects.all()
# 数据对象列表为 book表的所有对象
serializer_class = BookSerializer
3.urls文件中
from rest_framework.routers import SimpleRouter
# 导入类
router = SimpleRouter()
# 使用类创建对象
router.register('api/v1/books', views.BookView, 'books')
# 在对象中注册 url路由 ps:不要加/因为会默认加/
urlpatterns = urlpatterns + router.urls
# 将对象中注册的路由合并到urlpatterns路由中
这样就完成了 restful接口的编写 可以通过请求方式来进行增删改查
可以使用postman测试接口
GET: http://127.0.0.1:8000/api/v1/books/ 查所有
GET: http://127.0.0.1:8000/api/v1/books/1/ 查id为1的数据
POST: http://127.0.0.1:8000/api/v1/books/ 新增一条数据
# 支持 json格式 urlencoded格式
PUT: http://127.0.0.1:8000/api/v1/books/1/ 修改单个数据
# 支持 json格式 urlencoded格式
DELETE: http://127.0.0.1:8000/api/v1/books/1/ 删除单个数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了