day96RESTful规范,DRF框架介绍、APIview源码分析
一 什么是RESTful?-----一种开发规范
REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”;
REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态;
所有的数据,不管是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性;
对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)。
二 RESTful API设计*****
RESTful 的API设计也就是开发者们常说的(RESTful的十大规范), 并不是说要完完全全的按照RESTful规范写出来的API才称作为RESTful API , 按照其中的某几个规范,开发出来的也可以成为遵循RESTful规范的API。
- 1API与用户的通信协议,总是使用HTTPs协议。
- 2域名
- https://api.example.com 将API部署在本站域名内部-----》不推荐,会存在
- https://example.org/api/ 将API部署在域名末尾 ------》 推荐,使用简单
- 3版本
- 注意:在接口首次写好供用户使用后, 后续如果有更改需求, 不能在原来接口上改。 需要开发另外一个版本来满足用户需求, 这样我们把原来的版本叫做V1或者1版本, 更改后的成为v2或者2版本
- 方式一、部署在url上
,如:https://api.example.com/v1/ 或https://example.org/api/ v2/ - 方式二、放在请求头内(不推荐,跨域时会引发多次请求)
- 4路径,视网络上任何东西都是资源,均使用名词表示(可复数)
- https://api.example.com/v1/zoos
- https://api.example.com/v1/animals
- https://api.example.com/v1/employees
5method----根据不同的
请求方式
- 来确定不同的请求操作。
-
GET :从服务器取出资源(一项或多项) POST :在服务器新建一个资源---非幂等 PUT :在服务器更新资源(客户端提供改变后的完整资源)---幂等 PATCH :在服务器更新资源(客户端提供改变的属性) DELETE :从服务器删除资源-什么是幂等性? -post请求不是幂等的 -put请求是幂等的。
-
对接口的多次调用所产生的结果和调用一次是一致的。
- 6过滤,通过在url上传参的形式传递搜索条件
- https://api.example.com/v1/zoos?limit=10:指定返回记录的数量
- https://api.example.com/v1/zoos?offset=10:指定返回记录的开始位置
- https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数
- https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
- https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件
- 7状态码
- 8错误处理,应返回错误信息,error当做key。
123{error:"Invalid API key"} - 9返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。
123456GET/collection:返回资源对象的列表(数组)GET/collection/resource:返回单个资源对象POST/collection:返回新生成的资源对象PUT/collection/resource:返回完整的资源对象PATCH/collection/resource:返回完整的资源对象DELETE/collection/resource:返回一个空文档 - 10Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
123456{"link": {"rel":"collection https://www.example.com/zoos","href":"https://api.example.com/zoos","title":"List of zoos","type":"application/vnd.yourformat+json"}}
摘自:http://www.ruanyifeng.com/blog/2014/05/restful_api.html
三、Django实现RESTful规范操作
注意:
- Django实现RESTful,存在局限性,因为只封装了POST和GET方法,对于其他方法需要自行封装操作(对body进行处理)。
路由层:
urlpatterns = [ url(r'^users/$', views.Users.as_view()), url(r'^users2/$', views.user2), ]
视图层:
3-1 基于FBV的实现方式 def user(request): if request.method=='GET': dic = {'status':200,'name': 'name', 'age': 18} return HttpResponse(json.dumps(dic)) elif request.method=='POST': # 状态码的返回,及信息返回 dic = {'status': 200, 'msg': '修改成功','url':'127.0.0.1/users/1'} return JsonResponse(dic)
3-2 基于CBV的实现方式 from django.shortcuts import render, HttpResponse from django.views import View class Test(View): # dispatch用于请求的分发,若重写则覆盖,必须调用父类的原生方法 def dispatch(self, request, *args, **kwargs): print(11) return super().dispatch(request, *args, **kwargs) # 如果发送一个get 请求,会响应到这个函数 # request必须传,后面的可传可不传(有可能有名,无名分组) def get(self, request, *args, **kwargs): print('get') return render(request, 'login.html') def post(self, request): name = request.POST.get('name') pwd = request.POST.get('pwd') if name == 'lqz' and pwd == '123': return HttpResponse('登录成功') else: return render(request, 'login.html', {'error': '用户名或密码错误'})
3-3 使用Postman 跳过前端模拟请求获取数据


四、drf是什么?(Django REST Framework的缩写)与如何使用
Django REST框架是用于构建Web api的强大而灵活的工具包,即Django内置模块的拓展,可视为Django的第三方APP插件包。
- Web可浏览API对于开发人员来说是一个巨大的可用性胜利。
- 身份验证策略,包括OAuth1a和OAuth2的包。
- 同时支持ORM和非ORM数据源的序列化。
- 可自定义的——如果不需要更强大的功能,只需使用常规的基于功能的视图。
- 丰富的文档和强大的社区支持。
- 得到Mozilla、Red Hat、Heroku、Eventbrite等国际知名公司的使用和信任。
安装djangorestframework的方法:
- 方式一:pip3 install djangorestframework
- 方式二:pycharm图形化界面安装
- 方式三:pycharm命令行下安装(装在当前工程所用的解释器下)
DRF包使用前到settings文件下INSTALLED_APPS设置一下:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', # 组件注册 'rest_framework', ]
在这里我们还是简单说一下,基于drf写接口时,为什么使用CBV而不采用FBV?
之前介绍Django的时候我们使用的基本上都是FBV, 虽然函数简单明了,但如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。
所以Django在后来加入了CBV。可以让我们用类写View,然后通过反射执行as_view()方法,这样做的优点主要下面两种:
1.提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承);
2.可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性。

浙公网安备 33010602011771号