restful 规范(建议)
需求:开发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的操作。
。
。
。
restful 规范(建议)的更多相关文章
- RESTful规范建议
RESTful概述 RESTful是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用. REST是Representational State T ...
- RESTful 规范
RESTful 规范 前言 rest 是一种软件架构风格,如果使用的是 rest 接口,那么就可以说你的接口是 restful. rest接口是围绕''资源''展开的,利用 HTTP 的协议,其实 r ...
- DjangoRestFramework 学习之restful规范 APIview 解析器组件 Postman等
DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组件 ...
- Django restful 规范
一.REST Frame Work REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态转移&q ...
- django rest framework restful 规范
内容回顾: . django请求生命周期 -> 执行遵循wsgi协议的模块(socket服务端) -> 中间件(路由匹配) -> 视图函数(业务处理:ORM.模板渲染) -> ...
- day89 DjangoRsetFramework学习---restful规范,解析器组件,Postman等
DjangoRsetFramework学习---restful规范,解析器组件,Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析 ...
- 18.DjangoRestFramework学习一之restful规范、APIview、解析器组件、Postman等
一 预备知识 预备知识:django的CBV和FBV CBV(class based view):多用,简单回顾一下 FBV(function based view): CBV模式的简单操作:来个登陆 ...
- day 87 DjangoRestFramework学习一之restful规范、APIview、解析器组件、Postman等
DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组 ...
- 01 drf源码剖析之restful规范
01 restful规范 目录 01 restful规范 1. 什么是restful规范 2.restful规范详细 1. 什么是restful规范 restful是一套规则,是程序间进行数据传输的一 ...
随机推荐
- python六十四课——高阶函数练习题(三)
案例五:求两个列表元素的和,返回新列表lt1 = [1,2,3,4]lt2 = [5,6]效果:[6,8,10,12] lt1=[1,2,3,4] lt2=[5,6] print(list(map(l ...
- 为什么swift是面向协议的编程--对面向对象机制的改进
主要目标是提供抽象能力和解决值类型的多态问题 Actually, Abrahams says, those are all attributes of types, and classes are j ...
- centos7下安装docker(15.3跨主机网络-macvlan)
除了ovrlay,docker还开发了另一个支持跨主机容器的driver:macvlan macvlan本身是linu kernel模块,其功能是允许在同一物理网卡上配置多了MAC地址,即:多个int ...
- linux内存源码分析 - 伙伴系统(释放页框)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 翻了一下之前的文章,发现竟然忘记写内核是如何释放页框的,罪过. 释放页框很简单,其实只有几步 检查此页是否被其他 ...
- 串行FLASH文件系统FatFs---转自野火论坛
为了支持长文件名,需要用到FATFS源码中的cc936.c的两个函数ff_convert,ff_wtoupper:这里面直接用了两个大数组(127KB)来做unicode转gbk(OEM)的对照表,这 ...
- 容器技术|Docker三剑客之docker-machine
docker-machine是什么? ocker-machine就是docker公司官方提出的,用于在各种平台上快速创建具有docker服务的虚拟机的技术,甚至可以通过指定driver来定制虚拟机的实 ...
- Groovy语言学习--语法基础(1)
2018年11月末,从上家公司离职后进入现在的公司.进入项目以来,发现项目中有很多groovy脚本,以前没接触过groovy,抽时间系统地学一下,也方便后期项目的开发和维护. groovy和java的 ...
- MapReduce中map并行度优化及源码分析
mapTask并行度的决定机制 一个job的map阶段并行度由客户端在提交job时决定,而客户端对map阶段并行度的规划的基本逻辑为:将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分 ...
- 新浪2017校园招聘---C++后台研发
一共10道题目,难度不大,就是题量大,时间短. 1. 编程 写一个函数,求出一字符串的所有排列. 2. 编程 实现一个在32位系统下把字符串转换成浮点数的函数 floa ...
- Pytorch 初识
文章目录 一个简单的回归网络的例子 再来一个例子 官方教程上图片识别的例子 import torch import torch.nn as nn import torch.nn.functional ...