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回去