restful规范
restful规范是什么,如何来的?
是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中的规范
Roy Fielding的博士论文提出的
restful规范的具体内容
1. 数据的安全保障
--》url链接一般都采用https协议进行传输,它比http 安全
2. 接口特征表现
--》url中带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://127.0.0.1/api/v1/books/ -->表示对图书操作:增加,删除,查询,修改,都用这一个地址
-https://127.0.0.1/api/v1/get_all_books/ 不符合restful规范
-https://127.0.0.1/api/v1/delete_books/ 不符合restful规范
5. 资源操作由请求方式决定
get 请求获取数据(获取所有、获取单条)
post 新增数据
put 修改数据
delete 删除数据
https://api.baidu.com/books - get请求:获取所有书
https://api.baidu.com/books/1 - get请求:获取主键为1的书
https://api.baidu.com/books - post请求:新增一本书书
https://api.baidu.com/books/1 - put请求:整体修改主键为1的书
https://api.baidu.com/books/1 - delete请求:删除主键为1的书
6. 请求地址中带过滤条件
----》只针对搜索所有接口
7. 响应状态码(两层)
http响应状态码:1xx、2xx、3xx、4xx、5xx
趣味图解HTTP状态码的含义:https://www.sohu.com/a/278045231_120014184
-404和403 和 405
-301和302
-1xx表示请求正在处理---》前端一般看不到
-2xx 表示请求处理成功--》经常看到
-201和200有什么区别
-3xx:重定向
-4xx:客户端错误
-5xx:服务端出错
成功都返回200,而在响应体中带状态码----》code:不同公司就不一样
{
"code": 101,
"msg": "用户名或密码错误"
}
-补充一:mysql 错误操作都会有个 数字(10060) 文字解释
-补充二:
-https://open.weibo.com/wiki/Error_code
8. 响应中带错误信息
{
"code": 101,
"msg": "用户名或密码错误"
}
9. 不同操作,返回格式符合如下标准
GET/collection:返回资源对象的列表(数组)
[{name:西游记,price:19},{name:三国,price:19}]
GET/collection/resource:返回单个资源对象
{name:三国,price:19}
POST/collection:返回新生成的资源对象
{name:三国,price:19}
PUT/collection/resource:返回完整的资源对象
{name:三国演义,price:19}
DELETE/collection/resource:返回一个空文档
---》大家都这么做
{
code:100
msg:查询成功
restult:[{name:西游记,price:19},{name:三国,price:19}]
}
10. 响应中带链接
序列化和反序列化
序列化:数据转换格式
序列化分两个阶段:
序列化:把我们识别的数据转换成指定的格式提供给别人
eg:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人
反序列化:把别人提供的数据转换/还原成我们需要的数据
eg:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中
drf安装和快速使用
基于Django编写符合restful规范的接口
假设已Book表为例,写他的5个接口
-1 查询所有
-2 新增一条
-3 修改一条
-4 删除一条
-5 查询一条
使用原生Django编写
class BookView(View): # 查看全部 def get(self, request): book_obj = models.Book.objects.all() l = [] for i in book_obj: l.append({'name': i.name, 'price': i.price}) back_dic = {'code': 100, 'msg': '查询成功', 'result': l} return JsonResponse(back_dic) # 添加数据 def post(self, request): name = request.POST.get('name') price = request.POST.get('price') models.Book.objects.create(name=name, price=price) back_dic = {'code': 100, 'msg': '添加成功'} return JsonResponse(back_dic) class BookDetailView(View): # 查看一条数据 def get(self, request, pk): back_dic = {'code': 100, 'msg': '查询成功', 'result': []} book_obj = models.Book.objects.filter(pk=pk).first() back_dic['result'] = [{'name': book_obj.name, 'price': book_obj.price}] return JsonResponse(back_dic) # 修改一条数据 def put(self, request, pk): data_dic = json.loads(request.body) name = data_dic.get('name') price = data_dic.get('price') back_dic = {'code': 100, 'msg': '修改成功', 'result': []} models.Book.objects.filter(pk=pk).update(name=name, price=price) back_dic['result'] = [{'name': name, 'price': price}] return JsonResponse(back_dic) # 删除一条数据 def delete(self, request, pk): models.Book.objects.filter(pk=pk).delete() back_dic = {'code': 100, 'msg': '删除成功'} return JsonResponse(back_dic)
使用drf版本
# 先安装djangorestframework模块3.14.0版本 '''在app中注册 INSTALLED_APPS = [ 'rest_framework', # 一定不要忘了加 , ] ''' # 写路由 from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register('book', views.BookView, 'book') urlpatterns += router.urls # 写视图类 from rest_framework.viewsets import ModelViewSet from app01.serializer import BookSerializer class BookView(ModelViewSet): queryset = models.Book.objects.all() serializer_class = BookSerializer # 写序列化类 from rest_framework import serializers from app01.models import Book class BookSerializer(serializers.ModelSerializer): class Meta(): model = Book fields = '__all__'
标签:name,Python,day02,price,back,dic,api,https,drf From: https://www.cnblogs.com/zfq132/p/17664910.html