1.web开发应用模式
在开发Web应用中,有两种应用模式:
1.1 前后端不分离
所谓的前后端不分离,就是前后端数据都在同一个服务器中,前端的样式以及页面渲染都由后端一次性渲染出来在前端浏览器中展示出来。
1.2 前后端分离
所谓的前后端分离,就是前端数据在单独的一个服务器中,前端浏览器先行请求前端样式文件然后根据前端样式的请求在向后端请求特定的数据即可,这样不在像以前安卓,IOS以及web浏览需要分别都需要自己的后端服务器,这样多个客户端只要请求统一的API接口,即可请求到指定的数据。节省后端开发的压力。
2.API接口
2.1 API接口分类
为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范,而且这种规范能够让后端写的接口,用途一目了然,减少双方之间的合作成本。
目前市面上大部分公司开发人员使用的接口服务架构主要有:restful、rpc。
- rpc: 翻译成中文:远程过程调用[远程服务调用].
post请求
action=get_all_student¶ms=301&sex=1
接口多了,对应函数名和参数就多了,前端在请求api接口时,就会比较难找.容易出现重复的接口
- restful: 翻译成中文: 资源状态转换.
把后端所有的数据/文件都看成资源.
那么接口请求数据,本质上来说就是对资源的操作了.
web项目中操作资源,无非就是增删查改.所以要求在地址栏中声明要操作的资源是什么,然后通过http请求动词来说明对资源进行哪一种操作.
POST http://www.lufei.com/api/students/ 添加学生数据
GET http://www.lufei.com/api/students/ 获取所有学生
DELETE http://www.lufei.com/api/students/<pk> 删除1个学生
3.RESTful API规范
3.1 理解REST
如果我们想要理解restful,就要理解Representational State Transfer这个词组的意思,表征性状态转移。
这里所说的表征性,其实指的就是资源。通常我们称为资源状态转移。
(1.)什么是资源
任何事物,只要有被引用到的必要,它就是一个资源。
我们在浏览器中看到的文本,视频,图片等等都是资源。这些都是实实在在存在的实体。
资源可以是一个实体,也可以是抽象概念。
比如说吧:
-- Alex的个人信息
-- 沛齐的手机号
-- Alex跟沛齐的潜在关系
这些都是资源,可以是实体比如个人信息,手机号。也可以是抽象的概念,比如两个人的关系......
那么在我们的网络中,我们要引用资源,资源一定要有一个标识,在web中的唯一标识就是URI,
URI我们不常听说,我们经常用URL,那么两者区别是什么呢~
(2.)什么是URI,URL
URI 统一资源标志符。
URL 统一资源定位符。
URI是给我们的资源进行标识的,URL是描述我们资源地址的。
比如说我们每个人都有名字和身份证,名字可能重名,但是身份证是唯一的,
那么身份证号就可以是我们的URI,标识我们每个人,也可以说标识我们每个资源。
我们可以通过身份证号找到Alex,也可以通过下面这种方式找到他.....
Alex的住址协议://地球/中国/屌丝省/屌丝市/寡妇村/250号街道/250号/Alex
这个就是我们的URL,我们通过这两种方式都可以找到我们的资源,
其实我们的URL可以说是URI的子集,通过定位的方式实现的URI。
这是我们资源的定位~~有了资源的地址后,我们要去访问资源,那么我们要通过什么方式去访问呢~~
(3.)统一资源接口
现在我们可以通过URL去访问到资源,那么我们对资源会有很多不同的操作,增删改查,
以前我们可能会为了这个增加新设计一个URL,然后这个URL就是对数据进行增加的,
还会为了更新和删除分别设计一个URL,现在我们不用了,我们只有一个URL,
然后根据HTTP请求方式的不同,对资源进行不同的操作,这个就是是统一资源接口。
我们一定要遵循HTTP请求方法的语义,也就是说POST请求就在新增数据等....
(4.)资源的表述
资源的表述其实就是资源的展现形式,我们客户端和服务端传输的都是资源的表述,而不是资源本身。
例如文本资源可以采用html、xml、json等格式,图片可以使用PNG或JPG展现出来。
那么客户端如何知道服务端提供哪种表述形式呢?
可以通过HTTP内容协商,客户端可以通过Accept头请求一种特定格式的表述,服务端则通过Content-Type告诉客户端资源的表述形式。
这些资源的表述呈现在页面上,就是我们说的资源状态。
我们在看页面的时候,从当前资源的表述(也可以说状态或者表现层)会跳转到其他的资源状态。
服务端通过超媒体告诉客户端当前状态有哪些后续状态可以进入。
这些类似"下一页"之类的链接起的就是这种推进状态的作用——指引你如何从当前状态进入下一个可能的状态。
总结如下:
可以得知REST风格的特点如下:
(1)在web中,只要有被引用的必要都叫资源。
(2)每个URI代表一个资源,独一无二的。
(3)客户端通过HTTP的方法,对服务器端资源进行操作;
(4)客户端和服务器之间,传递这种资源的某种表现层;
(5)通过超链接的指引,实现"表现层状态转移"。
3.2 RESTful API规范
REST全称是Representational State Transfer,中文意思是表述性状态转移。 它首次出现在2000年Roy Fielding的博士论文中。
RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中。
这种风格的理念认为后端开发任务就是提供数据的,对外提供的是数据资源的访问接口,所以在定义接口时,客户端访问的URL路径就表示这种要操作的数据资源。
而对于数据资源分别使用POST、DELETE、GET、UPDATE等请求动作来表达对数据的增删查改。
请求方法 | 请求地址 | 后端操作 |
GET | /students | 获取所有学生 |
POST | /students | 增加学生 |
GET | /students/<pk> | 获取编号为pk的学生 |
PUT | /students/<pk> | 修改编号为pk的学生 |
DELETE | /students/<pk> | 删除编号为pk的学生 |
事实上,我们可以使用任何一个框架都可以实现符合restful规范的API接口。
参看文档:https://www.cnblogs.com/gbq-dog/p/10771078.html
4.序列化
api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把数据转换格式,序列化可以分两个阶段:
序列化: 把我们识别的数据转换成指定的格式提供给别人。
例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人。
反序列化:把别人提供的数据转换/还原成我们需要的格式。
例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。
5.Django Rest_Framework
核心思想: 缩减编写api接口的代码
Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用。在REST framework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持。REST framework提供了一个API 的Web可视化界面来方便查看测试接口。
中文文档:https://q1mi.github.io/Django-REST-framework-documentation/#django-rest-framework
github: https://github.com/encode/django-rest-framework/tree/master
特点
提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
提供了丰富的类视图、Mixin扩展类,简化视图的编写;
丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
多种身份认证和权限认证方式的支持;[jwt]
内置了限流系统;
直观的 API web 界面;
可扩展性,插件丰富
a