内容概览
前后端开发模式API接口接口测试工具postmanrestful规范序列化与反序列化djangorestframework快速使用CBV源码分析
前后端开发模式
前后端混合开发 在后端通过前端写好的html页面,使用模板语法渲染出页面然后返回给前端展示前后端分离开发 前端先请求到静态页面,需要数据向后端发送请求,后端将前端需要的数据返回(json/xml); 前端只负责写前端,写的过程中使用mock数据。后端只负责写后端(API接口),使用接口测试工具测试(postman) 最后前后端联调项目
API接口
API(Application Programming Interface)开发接口标准之一:通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介
API接口的样子:
url:长得像返回数据的url链接 https://api.map.baidu.com/place/v2/search请求方式:get、post、put、patch、delete 采用get方式请求上方接口请求参数:json或xml格式的key-value类型数据 ak:6E823f587c95f0148c19993539b99295 region:上海 query:肯德基 output:json响应结果:json或xml格式的数据
接口测试工具postman
后端写完接口后,不可能在浏览器中测试,需要使用测试软件来做接口测试 实际上就是模拟发送http请求
restful规范
REST全称是Representational State Transfer,中文意思是表述:表征性状态转移 RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中 restful的规范有十条:
数据的安全保障:url链接一般采用HTTPS协议传输接口中带有api关键字多版本数据共存,一个接口可能有多个版本,在url中携带版本标识数据既资源,均使用名词(可以使用复数)相同的地址,资源的操作方式由请求方式决定 get:获取数据 post:新增数据 delet:删除数据 put/patch:修改数据url地址中带过滤参数 获取书店中所有书籍:127.0.0.1/api/v1/books 获取书店中所有教材类书籍:127.0.0.1/api/v1/books?type=textbook响应带状态码,在响应体中携带状态码,通过数字来代表一段信息 http状态码: 1xx:请求正在处理 2xx:请求处理成功 3xx:重定向 4xx:客户端错误 5xx:服务端错误 公司可能会有自己规定的响应状态码返回错误信息,在响应体中携带错误信息返回结果,针对不同操作,服务器向用户返回的结果应该符合一下规范(现在一般不会完全符合该规范) GET /collection:返回资源对象的列表(数组)[{},{}] GET /collection/resource:返回单个资源对象 {} POST /collection:返回新生成的资源对象 {} PUT /collection/resource:返回完整的资源对象 {} PATCH /collection/resource:返回完整的资源对象 {} DELETE /collection/resource:返回一个空文档响应中带链接
序列化和反序列化
api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把数据转换格式 序列化:将我们能够识别的数据转换成其他语言能够识别的数据格式提供 反序列化:将别人序列化过后的的数据转换成我们所需要的格式
djangorestframework快速使用
使用django框架,开发前后端分离项目: 原生django,使用JsonResponse返回数据即可 使用djangorestframework可以快速的写出符合restful规范的接口 接口总共就只有5个以及这5个的变形 获取所有:get 获取单个:get 新增一个:post 修改一个:put/patch 删除一个:delete 对于book表,使用drf快速实现这5个接口 先安装drf:pip install Djangorestframework
urls.py
from django.contrib import admin
from django.urls import path
from rest_framework.routers import SimpleRouter
from app01 import views
router = SimpleRouter()
router.register('books', views.BookView)
urlpatterns = [
path('admin/', admin.site.urls),
]
urlpatterns += router.urls
views.py
from .models import Book
from rest_framework.viewsets import ModelViewSet
from .serializer import BookSerializer
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
models.py
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=32)
price = models.CharField(max_length=32)
publish = models.CharField(max_length=32)
serializer.py
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
通过postman测试
CBV源码分析
"""cbv写好后,在路由中配置"""
path('test/', views.TestView.as_view())
"""会先执行as_view这个方法,按照查找顺序一层层查找该方法"""
@classonlymethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
return self.dispatch(request, *args, **kwargs)
return view
"""在父类中找到as_view方法,方法中定义了一个函数并返回,在路由匹配成功后执行此函数"""
"""在View中找到dispatch方法"""
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names: # 将请求方式转成小写,判断是否在后者的列表中;
"""http_method_names = [
"get","post","put","patch",
"delete","head","options","trace",
]"""
handler = getattr(self, request.method.lower(), self.http_method_not_allowed) # 通过反射获取到请求方式对应的方法
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) # 返回该方法的返回值
好文阅读
发表评论