API接口
前后端分离的开发模式:
客户端和服务端采用restful API的交互方式进行交互
前后端代码库分离,前端代码可以进行mock测试
能够独立开发和测试
后端则用postman接口测试软件测试,以保证API的可用性 降低集成风险
API接口 类似于view函数 连接前端和url的
通过网络 规定了前后端信息交互规则的链接 也是前后端信息交互的媒介
API接口的样子:
-url :
https://api.map.baidu.com/place/v2/search
-请求方式:
post,get,put,patch,delete
-请求参数:json或者xml的格式的key:value类型数据
ak:
region:
query:
otuput:json
-响应结果:json或者xml格式的数据 # 现在一般是使用json格式
restful规范
# RESTful是一种定义web API接口的 设计风格 尤其适用前后端分离的应用模式中
规范有10点:
1.数据的安全保障:url链接一般都采用https协议进行传输
https就是http+ssl/tsl # 相当于加密之后的http 更安全
2.接口中带API关键词 可以带在url或域名中
3.多数据版本共存
一个接口存在多个版本
在url连接中携带版本标识
4.数据即资源,均使用名词 接口尽量使用名词
5.资源操作由请求方式决定method
获取数据:get请求
删除数据:delete请求
新增数据:post请求
修改数据:put,patch请求
# 请求的地址一样,通过请求方式决定对资源进行什么样的操作
6.url地址中携带过滤参数
7.响应带状态码
-http状态码:
1XX : 表示请求正在处理
2XX :表示请求处理成功 200 ok 等
3XX :重定向 302临时重定向 301永久重定向
4XX :客户端错误 403拒绝访问csrf 404找不到资源
5XX:服务端错误 500 服务器内部错误
-响应体中写状态码:按照公司规范来写
8.返回错误信息 响应体中携带错误信息
9.返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范
GET /collection:返回资源对象的列表(数组)[{},{}]
GET /collection/resource:返回单个资源对象 {}
POST /collection:返回新生成的资源对象 {}
PUT /collection/resource:返回完整的资源对象 {}
PATCH /collection/resource:返回完整的资源对象 {}
DELETE /collection/resource:返回一个空文档
一般可能会这么写:
-获取所有:{code:100,msg:成功,data:[{name:红楼梦,price:99},{name:西游记,price:88}]}
-获取单条:{code:100,msg:成功,data:{name:红楼梦,price:99}}
-新增数据:{code:100,msg:新增成功,data:{name:西游记,price:99}}
-修改数据:{code:100,msg:修改成功,data:{name:西游记v2版本,price:99}}
-删除数据:{code:100,msg:删除成功}
10.响应中携带链接
比如图片链接 跳转的地址链接等
postman接口测试工具
官网下载:https://www.postman.com/downloads/
本质就是模拟发送http请求
序列化和反序列化
# api接口开发,最核心常见的一个过程就是序列化 就是把数据转换格式
序列化:将我们能够识别的数据转换成指定的格式提供给别人
反序列化:将被人提供的数据转换成我们能够识别的格式
快速使用drf
# 使用django这个web框架 开发前后端分离项目(模板渲染),只写接口
# 写接口:一共五个请求方式和这些方式的变形
获取所有 get
获取单个 get
新增一条 post
修改一条 put/patch
删除一条 delete
需要先下载一下模块:
安装drf:pip3 install djangorestframework
第一步 :先在models里面创建一个模型
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__'
第三步:在view里写入接口函数
from .models import Book
from rest_framework.viewsets import ModelViewSet
from .serializer import BookSerializer
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
第四步:写路由
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),
path('admin/',views.TestView.as_view())
]
urlpatterns += router.urls
CBV源码分析(很重要!!!)
path('/',Views.TestView.as_view())
第一个参数是路径,第二个参数是视图函数的内存地址
在TestView没有找到as_view这个方法,只能去继承的类View中找
as_view被@classonlymethod装饰了 继承了classmethod 本质就是classmethod 专门给类调用的方法
在as_view方法内定义了一个view方法 返回的是TestView().dispatch(reuqest)
当请求来了,路由匹配成功,会执行view(request) 本质是执行TestView().dispatch(reuqest)
查看dispatch发现是个方法里面的判断就是为什么cbv能根据请求的方式的不同匹配到不同的方法
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
通过反射方法getattr,获取到提交的请求,最后返回handler()
self是TestView的对象 handler就是TestView类的方法
# CBV视图层中,dispatch方法可以说是前端向后端发送请求的调度员,可以根据不同的请求方式执行视图函数中对应的方法
标签:前后,请求,models,分离,接口,API,import,drf,view
From: https://www.cnblogs.com/Hsummer/p/16723975.html