天天看点

基于Django RESTframework设计Restful API导语什么是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用总结

  关于restful的问题,在最近的面试中遇到很多,之前有过一定的了解,但没有系统性的总结分析。所以现在结合django restframework来加深对restful的理解,同时梳理这过程的一些知识点。
 这个问题是最容易想到的,首先要分析这个问题,网上的其他文章都会讲到有关rest(representational state transfer),中文翻译:”表述性状态传递“,再白话一点就是对资源的表述性状态传递。刚开始,看到这里头都大了,那我们来看看其中比较关键需要了解到的知识点。
 这里的资源指的是网络上的每一个实体,而每一个实体都有着对应的uri(统一资源标识符),如果需要访问这个资源,可以通过访问它的uri即可。
 简单来说就是资源的表现形式,比如图片、html、文本等等。
  客户端可以通过get、post、put、delete http动词来操作资源。
  rest从资源的角度来审视整个网络,将分布再网络中某个结点通过uri进行标识,而客户端和服务端传递的是资源的某种表现层,并且客户端通过http动词,对服务器资源操作,实现”表述性状态转化“。(表述性:客户端请求一个资源,并且通过服务器拿到资源)  满足以上这些约束条件和原则的应用程序或设计就是restful。换言之restful就是一种架构的规范和约束。
对api的设计来讲,restful是如今常见的的设计规范,通常用于web数据接口的设计。这里讲讲从网上大致总结的几个restful api的设计细节。
 客户端使用”动词+宾语"的结构操作服务器资源,动词指的是http动词,宾语指的是资源。http动词对应的服务器资源操作: get(select):从服务器取出资源(一项或多项)。 post(create):在服务器新建一个资源。 put(update):在服务器更新资源(客户端提供改变后的完整资源)。 patch(update):在服务器更新资源(客户端提供改变的属性)。 delete(delete):从服务器删除资源。
 由于宾语是api中的uri,是http动词作用的的对象,应该是名词,而不是动词。
 对于uri建议使用复数
客户端的每一次请求,服务器给出回应,而回应包括http状态码和数据两部分。 http状态码的含义: 1xx:相关信息 2xx:操作成功 3xx:重定向 4xx:客户端错误 5xx:服务器错误
 api返回的数据格式,不应该是一个纯文本,应该是一个json对象,这样才符合结构化流程。同样服务器回应的http头的content-type属性同样要设置为application/json。
 在发生错误的时候,不应该返回一个200状态码,然后把错误信息放在数据体里,因为这样会导致需要解析完数据体才能知道操作失败。
 django restframework是一个基于django上构建符合restful风格web api,并且自身还带有测试的页面,方便测试自己的api,所以对于”前后端分离“的开发模式来讲十分合适。
 前后端分离指的是后端来说只需要提供数据接口,不再渲染模板,前端只需要获取数据并且呈现。这样的有许多优点: 前后端解耦,接口复用,减少开发量 各司其职,前后端同步开发,提升工作效率,定好接口规范 更利于调试、测试和运维
rest framework基本组件: apiview 解析器组件:对请求的数据进行解析,根据不同请求题进行解析 序列化组件:类似于django的form,可以通过自定义操作获得想要的数据形式 视图类(mixin) 认证组件 权限组件 频率组件 分页组件 响应器组件 url注册器
 关于django的视图函数,可以基于fbv模式也可以基于cbv模式: fbv模式:django的路由映射表里进行url和视图函数的关联 cbv模式:而cbv模式则是在views.py中定义视图类,在视图类中视图函数,如(get,post,put,delete)等  django restframework就是基于cbv模式,当一个http请求到达django后,首先执行中间件的方法,然后在进行路由匹配。
基于Django RESTframework设计Restful API导语什么是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用总结
 当路由匹配后,会执行自定义类中的as_view()方法,如果不存在则会调用父类的as_view()方法,最后再调用到dispatch()方法处理不同request请求,执行不同的方法。(这段过程中设计到django cbv模式的处理流程,以及一些源码知识)

安装django restframework:

基于Django RESTframework设计Restful API导语什么是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用总结

新建项目,新建应用,修改settings.py

settings.py(将rest_framework新增到installed_apps)

基于Django RESTframework设计Restful API导语什么是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用总结

(其余的修改数据库配置、修改语言、时区就不一一列出来)

项目文件树:

基于Django RESTframework设计Restful API导语什么是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用总结

设计一个有关于存储歌曲的详细信息表(music/models.py):

同步数据库:

创建一个序列化serialier类,提供序列化和反序列化的途径,使之可以转化为如json的表现形式,类似于django的form表单的原理。在music目录下,创建serializers.py:

通过前面提到的cbv模式,设计视图处理函数和路由映射:

crawl/urls.py

music/urls.py

music/views.py

代码详解:

 代码比较简单,主要就是继承restframework框架的通用视图函数generics,或者apiview。如果先省事,建议generics,因为提供的通用视图可以允许你快速构建与数据相关的api视图,当然如果觉得通用视图不适合自己的api需求,可以使用apiview类。 (在这里两种方式都用到了,可以对比他们的区别)

模拟请求api接口(get、post请求)

基于Django RESTframework设计Restful API导语什么是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用总结
基于Django RESTframework设计Restful API导语什么是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用总结
基于Django RESTframework设计Restful API导语什么是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用总结

自带的测试页面:

基于Django RESTframework设计Restful API导语什么是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用总结
刚开始接触到restful方面的知识还是非常懵的,对网上很多文章感觉讲的也不是很全面,所以索性总结一下,然后接触到restframework框架也发现到了很多在django方面不熟悉的地方,如cbv模式,以及工作的原理,有些都牵扯到框架内的源码,也是从网上一些优秀的文章一点点慢慢了解到,之后对django restframework相关知识也会继续总结学习,下面是我在网上参考的一些文章,有兴趣的可以了解一下。

参考链接:

https://www.cnblogs.com/renpingsheng/p/9531649.html https://www.cnblogs.com/renpingsheng/p/9534984.html#feedback https://www.jianshu.com/p/08a998f74ac7