需求:开发cmdb,对用户进行管理。
做前后端分离,后端写api(URL),对用户表进行增删改查,应该写四个URL(还要给文档(返回值,返回,请求成功,干嘛,失败,干嘛)),然后分别写视图函数。
http://www.cmdb.com/add_user/
{
code:666,
data:[数据]
}
http://www.cmdb.com/update_user/
http://www.cmdb.com/delete_user/
http://www.cmdb.com/get_user/
把这四个URL给前端,Vue里面发axios用的是jquery
$.ajax({
})
订单管理:
第一种:接口开发是用这种方式来实现
路由:
from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^get_order/', views.get_order), url(r'^update_order/', views.post_order), url(r'^add_order/', views.add_order), url(r'^delete_order/', views.add_order), ]
视图:
from django.shortcuts import render,HttpResponse # Create your views here. def update_order(request): return HttpResponse('更新') def add_order(request): return HttpResponse('添加') def get_order(request): return HttpResponse('获取') def delete_order(request): return HttpResponse('删除')
这个方式有个小问题就是前端记着的URL会越来越多越来越多,后端给前端提供的URL也会越来越多。对十张表进行增删改查需要四十个URL。
所以渐渐地就出现了个潜规则就修订了一个规范,如果按照这个规范做的时候会简洁一些。
就出现了restful规范,是对上面的一些建议。
其中第一个建议就是:对于一条数据,就写一个URL就行了。到后台怎么去区分增删改查呢?根据method的不同来区分。
就写一个URL
路由:
from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^order/', views.add_order), ]
如果执行这个order的时候,这个URL隐含了增删改查。在后台做个区分,前端如果发GET请求就查,就获取一个订单。发POST就传建一个订单。发DEETE请求就删除一个订单。发PUT请求就更新一个订单。
视图:
from django.shortcuts import render,HttpResponse def order(request): if request.method == 'GET': return HttpResponse('获取') elif request.method == 'POST': return HttpResponse('添加') elif request.method == 'DELETE': return HttpResponse('删除') elif request.method == 'PUT': return HttpResponse('更新')
也可以基于CBV来写,基于cbv会更好,因为基于cbv,method判断就不用写了。只要写上方法就可以了。
路由:
from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^order/', views.OrderView.as_view()), ]
视图:
from django.shortcuts import render,HttpResponse # Create your views here. from django.views import View from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator @method_decorator(csrf_exempt,name='dispatch') class OrderView(View): def get(self,request,*args,**kwargs): return HttpResponse('获取') def post(self,request,*args,**kwargs): return HttpResponse('添加') def delete(self,request,*args,**kwargs): return HttpResponse('删除') def put(self,request,*args,**kwargs): return HttpResponse('更新')
restful 规范
10个规范:
1.与后台做交互,通常采用https协议,这样安全.
2.域名 有两种格式
子域名的方式:
https://www.baidu.com.
https://api.baidu.com 这就说明这是百度提供的这个接口,这种存在跨域问题(域名或者端口号不同)浏览器有同源策略,就会把这个请求回来的时候浏览器就给阻止了(同一个域名不会阻止,不同的域名就会阻止)。需要自己解决跨域问题。
URL方式:同一个域名,知识URL不同。
https://www.baidu.com.
https://www.baidu.com/api/
3.版本 ,接口不能保证不改动
https://www.baidu.com/api/v1 第一版
https://www.baidu.com/api/v2 第二版
能加在URL上,也可以加在请求头上。 跨域时,引发发送过多次数。
前缀:
https://www.baidu.com/api/v2
面向资源编程:本质就是把网络上的任何东西都当做是一个资源,对这个资源可以进行增删改查。一个资源应该是个名词,所以一个URL后面跟一个名词,这个名词就代表这个东西,我要对这个东西进行增删改查(get,delete,put,post...都是动作)对这个资源进行不同的动作进行不同的操作。
面向对象编程:
面向切面编程:
4.路径上所有的东西都是资源,均使用名词来表示。不用动词get,delet。。。
https://www.library.com.api/v1/books
https://www.library.com.api/v1/book
5.method(请求的方式)来表示增删查改,链接上看不出来只有在请求方式上能看出来增删查改。
https://www.library.com.api/v1/books/ get请求,获取所有书
https://www.library.com.api/v1/books/ post请求,新增一本书
https://www.library.com.api/v1/book/1 delete请求,删除一本id为1的书
https://www.library.com.api/v1/book/1 get请求,获取id为1的这本书
https://www.library.com.api/v1/book/1 put/patch请求,修改id为1的这本书 put代表全更新是全部更新
6.在URL上传参的形式传递搜索条件过滤条件
https://www.library.com.api/v1/books?limit=10 只拿前十本书
https://www.library.com.api/v1/books?price=20 只拿价格为20元的书
7.状态码 ----->给客户做提示 状态码跟code结合一起用
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 - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
等价于:{'status':100,}
class OrderView(View): def get(self,request,*args,**kwargs): response = { 'code':100, 'msg':'successful' } return HttpResponse(json.dumps(response),status=201) #状态码也可以写其他的 用code还是状态码 对状态码有要求的可以写
8.错误处理,,返回错误信息给客户,error当做key
{'status':101,'error':"不可以这样"}
9.返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。
GET / order 获取所有订单 collection:返回资源对象的列表(数组)
GET / order /1 获取一个订单的详细 collection/resource:返回单个资源对象
POST /order 返回新生成的的订单 collection:返回新生成的资源对象
PUT / order 修改全部部订单 collection/resource:返回完整的资源对象
PATCH /order 修改局部订单 collection/resource:返回完整的资源对象
DELETE /order collection/resource:返回一个空文档
10.返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
返回结果中提供链接(获取一本书)
{
id:1
name:xxx
price:12
publish:www.xxx.com.api/v1/publish/1
}
面试:谈谈你对restful api 规范
他都有什么?谈谈你对他的认识?
面试就是讲故事!
本质上就是一些规范,定义一些规范让咱们写api的时候更好作区分更容易让我们的后台去做处并且让前端更容易记住这些URL。就是在这个URL上体现api的操作。
。
。
。