zoukankan      html  css  js  c++  java
  • RESTful api 与 Django的 restfulframework

    RESTful api 与 Django的 restfulframework



    1 restful api 的基本概念


    一类的资源使用一个url,不同的操作通过 请求方式处理


    api -- >> 就是一个url

    两个用途:
    
        为别人提供服务(发送邮件或者是发短信, 运营商提供接口, 客户通过api提交数据)
    
        前后端分离
            越来越火(原来是后端通过模板引擎实现)
    

    restful(资源状态转移--它一种约定)

    -- >> 对互联网上任意东西(url) 都视为资源 -- 面向资源编程

    Re
    资源(***) --- 每一个url,代表资源,网络上的具体信息
    
    S(State)
    表现层 ----  客户端与服务器之间,传递这种资源的某种表现层
    
    T(Transfer)
    状态转换   ----  POST/GET/PUT/DELETE  对服务器资源进行操作,实现转换
    

    restful api是 实现 前后端分离的最佳实践

    请求一个url的方式遵循:
        GET
        POST
        PUT
        DELETE
    

    1 轻量,直接通过http,不需要额外的协议,post/get/delete

    2 面向资源,一目了然,具有自解释性

    3 数据描述简单,一般是 json,或者 xml 进行数据通信


    前后端分离的优点与缺点

    优点

    pc,app,pad 多端适应
    SPA (single page) 开始流行
    前后端开发 职责不分(解决template 由谁来写的问题)
    提高开发效率,前后不用再互相等待
    降低模板语言耦合性
    
    (不再用模板语言)
    

    缺点

    前后端学习 门槛增加
    文档(后端给前端--文档)
    前端工作量增加
    SEO
    后端开发去、模式迁移增加成本
    

    2 restful api 设计规范:


    协议
    API与用户的通信协议,总是使用HTTPs协议。
    
    域名 
    https://api.example.com                         尽量将API部署在专用域名(会存在跨域问题)
    https://example.org/api/                        API很简单
    
    版本
    URL,如:https://api.example.com/v1/
    
    请求头
    跨域时,引发发送多次请求
    
    路径,视网络上任何东西都是资源,均使用名词表示(可复数)
    https://api.example.com/v1/zoos
    https://api.example.com/v1/animals
    https://api.example.com/v1/employees
    
    method
    
    GET      :从服务器取出资源(一项或多项)
    POST    :在服务器新建一个资源
    PUT      :在服务器更新资源(客户端提供改变后的完整资源)
    PATCH  :在服务器更新资源(客户端提供改变的属性)
    DELETE :从服务器删除资源
    
    过滤,通过在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:指定筛选条件
    
    状态码
    
    
    错误处理,状态码是4xx时,应返回错误信息,error当做key。
    
    {
        error: "Invalid API key"
    }
    
    返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。
    
    GET /collection:返回资源对象的列表(数组)
    GET /collection/resource:返回单个资源对象
    POST /collection:返回新生成的资源对象
    PUT /collection/resource:返回完整的资源对象
    PATCH /collection/resource:返回完整的资源对象
    DELETE /collection/resource:返回一个空文档
    
    Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
    
    {"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 
    

    REST 的设计原则

    	统一接口  Uniform interface
    
    	无状态  Stateless
    
    	可缓存  Cacheable
    
    	服务端 客户端分离  Client-Server
    
    	分层系统  Layered System
    
    	按需编码  Code on command
    

    3 CBV 模型:


    基于类视图与基于函数的视图

    django的 cbv(class base view) 和 fbv(function base view)
    

    cbv 是django 官方推荐的方式, 代码重用性好

    功能实现方法

        通过dispatch 方法 ,反射 request中 method 的 对应值,获得相应的方法
        路由
            CView.as_view()  == >> 返回 view 函数   | 调用dispatch(返回相应的response对象)
    
            CBV ----  基于反射实现  根据不同的请求方式 执行不同的方法
    

    在请求前后 加上一段功能,多个类继承 基类

    class MyBaseView(object):
        def dispatch(self, request, *args, **kwargs):
            print('before')
            ret = super(MyBaseView,self).dispatch(request, *args, **kwargs)
            print('after')
            return ret
    
    
    class LoginView(MyBaseView,APIView):
    
        def get(self,request,*args,**kwargs):
    
            ret = {
                'code':1000,
                'data':'老sdas'
            }
            response = JsonResponse(ret)
            return response
    

    4 Django Restful framework:


    基于 django 开发 的用于 RESTful api 接口的 框架;


    (1)安装:

    依赖 django

     (1)pip install djangorestframework
    
    	 需要安装django -- 可以使用豆瓣镜像 加速
    	 pip install -i https://pypi.douban.com/simple/ django 
    
      (2)pip install markdown django-filter
      		两个包一起安装
    

    (2) DRF中的 request 与 django的 request的区别

    DRF 的 request 对 django 的 request 进行了更一步的封装

    (1)通过 dispatch 添加 内容
           parser
           autheticators  # 获取认证相关的所有类,并实例化,传入request对象(user,auth)
           negotator
           parse_context
                        
            可以把认证类,写在配置文件中 --- 全局配置
    
            也可以视图中 定义 --- 视图配置
    			authentication_classes =[] 来取消认证     
    
            REST_FRAMEWORK = {
                'UNAUTHENTICATED_USER':None,
                'UNAUTHENTICATED_TOKEN':None,
                'DEFAULT_AUTHENTICATION_CLASSES':[
                    'goods.utils.MyAuthentication'
                ]
            }
    
    (2)执行 initialize 方法
    
            处理版本
            认证 auth
            权限 permission
            访问频率限制 throttle
    
    (3) 通过 反射  执行相应的 方法
    
    (4)response 加工 ,返回结果
  • 相关阅读:
    大话重构读书笔记——保险索下的系统重构
    大话重构读书笔记——小步快跑的开发模式
    大话重构读书笔记——基础篇一
    [C#高级编程]基础知识摘要一
    测试基础
    WatiN和HttpWatch交互简介
    WatiN框架学习二——对弹窗的处理
    WatiN框架学习
    [C#高级编程].NET体系结构
    http协议的API
  • 原文地址:https://www.cnblogs.com/big-handsome-guy/p/8490348.html
Copyright © 2011-2022 走看看