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是一套规则,是程序间进行数据传输的一 ...
随机推荐
- 2.04-proxy-handler
import urllib.request def create_proxy_handler(): url = "https://blog.csdn.net/m0_37499059/arti ...
- OLTP与OLAP的区别
OLTP和OLAP的区别 联机事务处理OLTP(on-line transaction processing) 主要是执行基本日常的事务处理,比如数据库记录的增删查改.比如在银行的一笔交易记录,就是一 ...
- Python:Day13
id() 查看内存地址 和while循环一样,在for循环中也可以使用break和continue,两者效果一样. repr
- pytorch例子学习-DATA LOADING AND PROCESSING TUTORIAL
参考:https://pytorch.org/tutorials/beginner/data_loading_tutorial.html DATA LOADING AND PROCESSING TUT ...
- nodejs部署智能合约的方法-web3 0.20版本
参考:https://www.jianshu.com/p/7e541cd67be2 部署智能合约的方法有很多,比如使用truffle框架,使用remix-ide等,在这里的部署方法是使用nodejs一 ...
- docker 6 docker运行的底层原理
docker是一个client-server结构的系统,docker守护进程运行在主机上,然后通过socket连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器,是一个运行时的环境,就 ...
- 【原创】分布式之elk日志架构的演进
引言 好久没写分布式系列的文章了,最近刚好有个朋友给我留言,想看这方面的知识.其实这方面的知识,网上各种技术峰会的资料一抓一大把.博主也是凑合着写写.感觉自己也写不出什么新意,大家也凑合看看. 日志系 ...
- lambda从入门到精通
JDK8中包含了许多内建的Java中常用到函数接口,比如Comparator或者Runnable接口,这些接口都增加了@FunctionalInterface注解以便能用在lambda上. name ...
- 面试 16:栈的压入压出队列(剑指 Offer 第 22 题)
我们今天继续来看看周五留下的习题: 面试题:输入两个整数序列,第一个序列表示栈的压入顺序,请判断二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如:压入序列为{1,2,3,4,5},那{ ...
- 【NLP】Attention Model(注意力模型)学习总结
最近一直在研究深度语义匹配算法,搭建了个模型,跑起来效果并不是很理想,在分析原因的过程中,发现注意力模型在解决这个问题上还是很有帮助的,所以花了两天研究了一下. 此文大部分参考深度学习中的注意力机制( ...