需求:开发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 规范(建议)的更多相关文章

  1. RESTful规范建议

    RESTful概述 RESTful是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用. REST是Representational State T ...

  2. RESTful 规范

    RESTful 规范 前言 rest 是一种软件架构风格,如果使用的是 rest 接口,那么就可以说你的接口是 restful. rest接口是围绕''资源''展开的,利用 HTTP 的协议,其实 r ...

  3. DjangoRestFramework 学习之restful规范 APIview 解析器组件 Postman等

    DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组件 ...

  4. Django restful 规范

    一.REST Frame Work REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态转移&q ...

  5. django rest framework restful 规范

    内容回顾: . django请求生命周期 -> 执行遵循wsgi协议的模块(socket服务端) -> 中间件(路由匹配) -> 视图函数(业务处理:ORM.模板渲染) -> ...

  6. day89 DjangoRsetFramework学习---restful规范,解析器组件,Postman等

     DjangoRsetFramework学习---restful规范,解析器组件,Postman等           本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析 ...

  7. 18.DjangoRestFramework学习一之restful规范、APIview、解析器组件、Postman等

    一 预备知识 预备知识:django的CBV和FBV CBV(class based view):多用,简单回顾一下 FBV(function based view): CBV模式的简单操作:来个登陆 ...

  8. day 87 DjangoRestFramework学习一之restful规范、APIview、解析器组件、Postman等

    DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等   本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组 ...

  9. 01 drf源码剖析之restful规范

    01 restful规范 目录 01 restful规范 1. 什么是restful规范 2.restful规范详细 1. 什么是restful规范 restful是一套规则,是程序间进行数据传输的一 ...

随机推荐

  1. SQL IN 操作符

    IN 操作符 IN 操作符允许我们在 WHERE 子句中规定多个值. SQL IN 语法 SELECT column_name(s) FROM table_name WHERE column_name ...

  2. 属性复制方法,当属性名字不一致时候可以传入匹配的Map

    /** * @param src * @param dest * @param filedMapping the diffrent fieldName mapping,key is src filen ...

  3. ssm框架的整合搭建(三)

    mybatis逆向工程工具类的使用---mybatis  generator 项目结构 配置文件 <?xml version="1.0" encoding="UTF ...

  4. Bean named '*' must be of type [*], but was actually of type []

    本地Service 名字和调用别的maven项目Service重名

  5. Memcache分布式锁 转发 https://www.cnblogs.com/li150dan/p/9529090.html

    在分布式缓存的应用中,会遇到多个客户端同时争用的问题.这个时候,需要用到分布式锁,得到锁的客户端才有操作权限 下面通过一个简单例子介绍: 这里引用的是Memcached.ClientLibrary.d ...

  6. LCA--倍增法

    一般来求LCA有3种方法 1.倍增 2.RMQ+欧拉序 3.tarjan(离线) 本文将倍增求lca 这个算法是很常见很常见的 也是较好理解的 (我也不明白假期学长讲的时候我为什么死活都不明白 自闭q ...

  7. python:实例化configparser模块读写配置文件

    之前的博客介绍过利用python的configparser模块读写配置文件的基础用法,这篇博客,介绍下如何实例化,方便作为公共类调用. 实例化的好处有很多,既方便调用,又降低了脚本的维护成本,而且提高 ...

  8. 十二省联考 - JLOI2019 游记

    十二省联考 - JLOI 2019 游记 想了想,还是起一个副标题吧 一场失败的胜利 Day -inf 想了想,还是从头开始说吧. 其实考完NOIP之后,大概估算一下,吉林省队的数量还算是比较乐观的, ...

  9. Vue-插槽学习

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 基于Metronic的Bootstrap开发框架经验总结(16)-- 使用插件bootstrap-table实现表格记录的查询、分页、排序等处理

    在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这个bootstrap-table是一款非常有 ...