api接口规范/DRF基本使用/序列化

Web应用模式

1.前后端不分离

客户端看到的内容和所有页面效果都是有一个服务器提供的。后端代码和前端代码都是一起返回的

image

前后端分离

把前端页面效果前端的代码单独分离到一个服务器或目录下面[html css js] 后端只需要返回数据即可,前端是一个独立的网站或地址,后端也是一个独立的网站。

优点:后端只需要一份代码可以对接多种web ios 安卓等前端应用

image

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&region=上海&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请求     查询id1的图书
  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基本使用说明

image

image

image

序列化与反序列化

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/id1的数据
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/  删除单个数据

posted @   Python-moon  阅读(116)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示