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状态码
    200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
    201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
    202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
    204 NO CONTENT - [DELETE]:用户删除数据成功。
    400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
    401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
    403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
    404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
    406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
    410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
    422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
    500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
    
    更多看这里:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
  • 8错误处理,应返回错误信息,error当做key。
    1
    2
    3
    {
        error: "Invalid API key"
    }
  • 9返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。
    1
    2
    3
    4
    5
    6
    GET /collection:返回资源对象的列表(数组)
    GET /collection/resource:返回单个资源对象
    POST /collection:返回新生成的资源对象
    PUT /collection/resource:返回完整的资源对象
    PATCH /collection/resource:返回完整的资源对象
    DELETE /collection/resource:返回一个空文档
  • 10Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
    1
    2
    3
    4
    5
    6
    {"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判断,提高代码可读性。

 

posted @ 2019-02-21 19:47  timm_book  阅读(72)  评论(0)    收藏  举报