基于django实现restful api
restful 规范(建议)
用户的增删改查,4个api即4个url,即user_add、user_delete、user_update、user_get
则基于用户管理的api开发为:后端:卢旭彤。前端:龙哥

a.接口开发
方式一:
在url.py中:
urlpatterns = [ # path('admin/', admin.site.urls), path (r'get_order/', views.get_order), path (r'add_order/', views.add_order), path (r'del_order/', views.del_order), path (r'update_order/', views.update_order), ]
在view.py中:
#订单的四个信息. def get_order(request): return HttpResponse('') def add_order(request): return HttpResponse('') def del_order(request): return HttpResponse('') def update_order(request): return HttpResponse('')
方式一:弊端,随着url越来越多会更麻烦,故出现restful规范。
方式二:restful规范(建议)
1、根据method不同让接口做不同的响应。示例:
基于FBV:
urlpatterns = [ path (r'order/', views.order), ] def order(request): if request.method == 'GET': return HttpResponse('获取订单') elif request.method == 'POST': return HttpResponse('创建订单') elif request.method == 'PUT': return HttpResponse('更新订单') elif request.method == 'DELETE': return HttpResponse('删除订单')
基于CBV:
urlpatterns = [ path (r'order/', views.OrderView.as_view()), ] class OrderView(View): def get(self, request, *args, **kwargs): return HttpResponse('获取订单') def post(self, request, *args, **kwargs): return HttpResponse('创建订单') def put(self, request, *args, **kwargs): return HttpResponse('更新订单') def delete(self, request, *args, **kwargs): return HttpResponse('删除订单')
注:不遵循规范也能实现。
restful规范的种类:一共10种如下:




注释:
1、https更安全,域名要认证,要买服务器。http不用
2、子域名方式:(域名不同会存在跨域问题,浏览器有同源策略可能会阻止请求回来)
www.luffycity.com(用户看到的)
api.luffycity.com(返回Jason数据)
URL方式:(同一个域名,只是URL不同)
www.luffycity.com
www.luffycity.com/api/(即加上一个api)
3、版本
www.luffycity.com/api/v1/(版本写在请求体也可以)
4、面向资源编程
网络上的东西都是资源,故使用名词或者名词复数作为URL,示例: www.luffycity.com/api/v1/order/
5、method
根据不同的方法做不同的操作,PUT代表全部更新,PATCH代表局部更新。示例:PUT让用户列表的用户名密码邮箱全部更新,而PATCH代表用户名的其中一项,比如说邮箱的更新。
6、过滤
对URL加条件,例如: www.luffycity.com/api/v1/order/?status=1&page=2
7、状态码
200 成功 ;4** 客户端错误:404找不到页面; 403csrf认证跨域问题;500服务器错误 ;301临时重定向;302永久重定向;
状态码(浏览器)+code(给前端)结合来写api.


修改状态代码为201
return HttpResponse(json.dumps(ret), status=201)

原代码:
class OrderView(View): def get(self, request, *args, **kwargs): ret = { 'code': 1000, 'msg': 'xxx' } return HttpResponse(json.dumps(ret), status=201) def post(self, request, *args, **kwargs): return HttpResponse('创建订单') def put(self, request, *args, **kwargs): return HttpResponse('更新订单') def delete(self, request, *args, **kwargs): return HttpResponse('删除订单')
另一种形式:
class OrderView(View): def get(self, request, *args, **kwargs): ret = { 'code': 1000, 'msg': 'xxx' } return JsonResponse(ret)
PS:状态码可以省略。
8、错误处理 后端像前端返回的结果
示例:
GET/order/ 返回资源对象的列表(数组) #获取所有订单
GET/order/1/ 返回单个资源对象 #获取一个订单的详细 1为订单的ID
POST/order/返回新生成的资源对象 #创建订单,返回给前端(规范定的)但实际上如果前端不要新对象,可以不用返回,否则浪费网络资源
PATCH/order/1/返回完整的资源对象 #修改数据库字段的局部列
PUT/order/1/ 返回完整的资源对象 #修改一个订单
DELETE/order/1/ 返回一个空文档 #删除一个订单
9、Hypermedia API(即下面实例的第一种方法)
c、谈谈自己对restful api 规范的认识
答:就是指以上的几类规范,可以不遵守只是建议。按照规范做更加统一第二种:跨域怎么解决,两种方式:JNSON P原理
状态码,二系列三系列四系列五系列,每个系列知道几个即可、MYSQL包括以上的10类规则。
总结:推荐使用CBV
浙公网安备 33010602011771号