rest_framework--RESTful规范

#####RESTful规范#####

一、什么是restful
    restful其实就是一种软件架构风格,跟技术毫无关系。是一种面向资源编程的方法。
    说起面向资源编程,我想起了之前了解到的面向过程编程,面向对象编程

二、restful的10种规范(直接copy了)
    (1)、API与用户的通信协议,总是使用HTTPs协议。
    (2)、域名
        https://api.example.com       尽量将API部署在专用域名(会存在跨域问题)
        https://example.org/api/      API很简单
    (3)、版本
        URL,如:https://api.example.com/v1/
        请求头              跨域时,引发发送多次请求
    (4)、路径,视网络上任何东西都是资源,均使用名词表示(可复数)
            https://api.example.com/v1/zoos
            https://api.example.com/v1/animals
            https://api.example.com/v1/employees
    (5)、method
            GET  :从服务器取出资源(一项或多项)
            POST :在服务器新建一个资源
            PUT  :在服务器更新资源(客户端提供改变后的完整资源)
            PATCH  :在服务器更新资源(客户端提供改变的属性)
            DELETE :从服务器删除资源
    (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)、返回数据必须带上状态码,也可以是自己写的状态码
    (8)、错误处理,应返回错误信息,error当做key。{'error':错误信息}
    (9)、返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。
            GET /collection:返回资源对象的列表(数组)
            GET /collection/resource:返回单个资源对象
            POST /collection:返回新生成的资源对象
            PUT /collection/resource:返回完整的资源对象
            PATCH /collection/resource:返回完整的资源对象
            DELETE /collection/resource:返回一个空文档
    (10)、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"
                }}

三、怎么基于django写restful规范代码呢(用CBV)
    路由层代码:
        url(r'login/',views.Login.as_views())

    视图层代码:
        from django.views import View
        class Login(View):
            def post(self,request,*args,**kwargs):
                response = {'status':100,'msg':None}
                name = request.POST.get('name')
                password = request.POST.get('password')
                if name == '朱宇' and password == '123':
                    response['msg'] = '登陆成功'
                else:
                    response['msg'] = '登陆失败'
                    response['status'] = 101
                return JsonResponse(response)

    又想起点东西写写吧,
    1、这里request.POST.get('name')  --->  取的是name这个key对应value的最后一个值
    2、JsonResponse(response)   --->  假如response光只是字典可以这样写,但是有列表的话,必须把safe=False,默认为True
    3、再看路由层层代码,as_view(),这里是加了括号的,所以在django程序启动时,就会执行,它是类的方法,执行结果时返回了一个
       view函数的内存地址,等路由来的时候,便会加括号执行view函数,view函数的返回值是dispatch(self, request, *args, **kwargs)
       的返回值。所以会执行dispatch方法
       下面是View类中的dispatch方法源码:
            def dispatch(self, request, *args, **kwargs):
            if request.method.lower() in self.http_method_names:
                handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed
            return handler(request, *args, **kwargs)
       我们可以从request对象中知道本次请求的请求方法,如果在http_method_names这个列表里的话,通过反射获得该请求方法(小写)命名
       方法的内存地址,并去执行,执行完毕return回去

猜你喜欢

转载自www.cnblogs.com/zhuchunyu/p/10130191.html