程序的客户端有很多:硬件设备,游戏,APP,软件,其他的外部服务端。
在开发Web应用中,有两种应用模式:
1.前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的。
这种情况下,前端页面中会出现很多涉及到服务端的模板语法。
django,一般都是做web网站,如果可以利用django实现前后端分离,则django就可以完成地铁站的运营调度系统,路由的终端系统,pos机的服务端系统,游戏的服务端后台,软件的服务端后台。
为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范,而且这种规范能够让后端写的接口,用途一目了然,减少双方之间的合作成本。
rpc: 翻译成中文:远程过程调用[远程服务调用].
服务端提供单一的请求数据的api地址:http://api.renran.cn/
post请求
action=get_all_student&class=301&sex=1
优势:
不需要管当前操作是什么http请求,也不需要操作url地址的编写,对接简单
缺点:
接口多了,对应函数名和参数就多了,前端在请求api接口时,就会比较难找.容易出现重复的接口
restful: 翻译成中文: 资源状态转换.
把后端所有的数据/文件都看成资源.
那么接口请求数据,本质上来说就是对资源的操作了.
web项目中操作资源,无非就是增删查改.所以要求在地址栏中声明要操作的资源是什么,然后通过http请求动词来说明对资源进行哪一种操作.
POST http://www.renran.cn/api/students/ 添加学生数据
GET http://www.renran.cn/api/students/ 获取所有学生
DELETE http://www.renran.cn/api/students/<pk>/ 删除id=pk的一个学生
PUT http://www.renran.cn/api/students/<pk>/ 修改一个学生的全部信息 [id,name,sex,age,]
PATCH http://www.renran.cn/api/students/<pk>/ 修改一个学生的部分信息[age]
优点:
维护开发简单,可以保证后期的开发不会出现太多重复接口
缺点:
有部分接口不会有明确的增删查改这种区分的,所以会出现一些不伦不类的接口。会因为这些语义不明,不伦不类的接口导致后期的维护成本上升。
因为restful把对于资源的操作都理解成了增删查改,建议使用http,所以restful接口天生局限于web开发。
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> |
事实上,我们可以使用任何一个框架都可以实现符合restful规范的API接口。
参考文档:http://www.runoob.com/w3cnote/restful-architecture.html
接口实施过程中,会存在幂等性。所谓幂等性是指代客户端发起多次请求是否对于服务端里面的资源产生不同结果。如果多次请求,服务端结果还是一样,则属于幂等接口,如果多次请求,服务端产生结果是不一样的,则属于非幂等接口。在http请求,get/put/patch/delete都属于幂等性接口,post属于非幂等接口。
为什么要考虑幂等性?主要就是接口操作的安全性问题。
delete /api/students/1
get /api/students/
post /api/students/
api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把数据转换格式,序列化可以分两个阶段:
序列化: 把我们识别的数据转换成指定的格式提供给别人。
例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给前端或者其他平台。
反序列化:把别人提供的数据转换/还原成我们需要的格式。
例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。
drf 准备知识(Web应用模式、 api接口、RESTful API规范和序列化)
原文:https://www.cnblogs.com/baicai37/p/13184548.html