什么是REST

  • REST与技术无关,代表的是一种软件架构风格.REST全称是Representational State Tranfer, 表征性状态转移.
  • REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用的转变装态
  • 所有的数据,不管是通过网络获取还是增删改查的数据都是资源, 将一切数据视为资源是REST区别其他架构风格的最本质属性
  • 对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)

RESTful API设计规范

  • API与用户的通信协议,总是使用HTTPS协议

  • 域名

  • 版本

  • method

    • GET :从服务器取出资源(一项或多项)
      • 安全且幂等

      • 获取表示

      • 变更时获取表示(缓存)

      • 200(OK) - 表示已在响应中发出

      • 204(无内容) - 资源有空表示

      • 301(Moved Permanently) - 资源的URI已被更新

      • 303(See Other) - 其他(如,负载均衡)

      • 304(not modified)- 资源未更改(缓存)

      • 400 (bad request)- 指代坏请求(如,参数错误)

      • 404 (not found)- 资源不存在

      • 406 (not acceptable)- 服务端不支持所需表示

      • 500 (internal server error)- 通用错误响应

      • 503 (Service Unavailable)- 服务端当前无法处理请求

    • POST :在服务器新建一个资源
      • 不安全且不幂等

      • 使用服务端管理的(自动产生)的实例号创建资源

      • 创建子资源

      • 部分更新资源

      • 如果没有被修改,则不过更新资源(乐观锁)

      • 200(OK)- 如果现有资源已被更改

      • 201(created)- 如果新资源被创建

      • 202(accepted)- 已接受处理请求但尚未完成(异步处理)

      • 301(Moved Permanently)- 资源的URI被更新

      • 303(See Other)- 其他(如,负载均衡)

      • 400(bad request)- 指代坏请求

      • 404 (not found)- 资源不存在

      • 406 (not acceptable)- 服务端不支持所需表示

      • 409 (conflict)- 通用冲突

      • 412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)

      • 415 (unsupported media type)- 接受到的表示不受支持

      • 500 (internal server error)- 通用错误响应

      • 503 (Service Unavailable)- 服务当前无法处理请求

    • PUT :在服务器更新资源(客户端提供改变后的完整资源)
      • 不安全但幂等

      • 用客户端管理的实例号创建一个资源

      • 通过替换的方式更新资源

      • 如果未被修改,则更新资源(乐观锁)

      • 200 (OK)- 如果已存在资源被更改

      • 201 (created)- 如果新资源被创建

      • 301(Moved Permanently)- 资源的URI已更改

      • 303 (See Other)- 其他(如,负载均衡)

      • 400 (bad request)- 指代坏请求

      • 404 (not found)- 资源不存在

      • 406 (not acceptable)- 服务端不支持所需表示

      • 409 (conflict)- 通用冲突

      • 412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)

      • 415 (unsupported media type)- 接受到的表示不受支持

      • 500 (internal server error)- 通用错误响应

      • 503 (Service Unavailable)- 服务当前无法处理请求

    • PATCH :在服务器更新资源(客户端提供改变的属性)
    • DELETE :从服务器删除资源
      • 不安全但幂等

      • 删除资源

      • 200 (OK)- 资源已被删除

      • 301 (Moved Permanently)- 资源的URI已更改

      • 303 (See Other)- 其他,如负载均衡

      • 400 (bad request)- 指代坏请求

      • 404 (not found)- 资源不存在

      • 409 (conflict)- 通用冲突

      • 500 (internal server error)- 通用错误响应

      • 503 (Service Unavailable)- 服务端当前无法处理请求

  • 路径,一切都是资源, 均用名词表示(可以复数)

  • 过滤, 通过在url上传参的形式传递搜索条件

状态码

  • 1 开头: 服务器正在处理

  • 2 开头: 服务器处理成功

  • 3 开头: 重定向

  • 4 开头: 客户端错误

  • 5开头 : 服务器错误

    在返回的数据中携带状态码

URl设计上的技巧

  • 使用 _或者 - 让URL可读性更好

  • 使用/表示资源层级关系

  • 使用?过滤资源

  • 使用,或者;表示同级资源关系

    GitHub使用来表示同级关系

基于Django实现

路由

urlpatterns = [
url(r'^users/$', views.Users.as_view()),
url(r'^users2/$', views.user2),
]

视图

import json

def  user2(request):
if request.method=='GET':
dic = {'status':200,'name': 'lqz2', 'age': 18}
return HttpResponse(json.dumps(dic))
elif request.method=='POST':
dic = {'status': 200, 'msg': '修改成功'}
return JsonResponse(dic) class Users(View):
def get(self, request):
dic = {'status':200,'name': 'lqz', 'age': 18}
return HttpResponse(json.dumps(dic)) def post(self, request):
dic = {'status': 200, 'msg': '修改成功'}
return JsonResponse(dic)

常见问题:

POST和PUT用于创建资源时有什么区别?

POST和PUT在创建资源的区别在于,所创建的资源的名称(URI)是否由客户端决定。 例如为我的博文增加一个java的分类,生成的路径就是分类名/categories/java,那么就可以采用PUT方法。不过很多人直接把POST、GET、PUT、DELETE直接对应上CRUD,例如在一个典型的rails实现的RESTful应用中就是这么做的。

我认为,这是因为rails默认使用服务端生成的ID作为URI的缘故,而不少人就是通过rails实践REST的,所以很容易造成这种误解。

客户端不一定都支持这些HTTP方法吧?

的确有这种情况,特别是一些比较古老的基于浏览器的客户端,只能支持GET和POST两种方法。

在实践上,客户端和服务端都可能需要做一些妥协。例如rails框架就支持通过隐藏参数_method=DELETE来传递真实的请求方法, 而像Backbone这样的客户端MVC框架则允许传递_method传输和设置X-HTTP-Method-Override头来规避这个问题。

APIView源码分析的更多相关文章

  1. CBV源码分析+APIVIew源码分析

    {drf,resful,apiview,序列化组件,视图组件,认证组件,权限组件,频率组件,解析器,分页器,响应器,URL控制器,版本控制} 一.CBV源码分析准备工作: 新建一个Django项目 写 ...

  2. $Django cbv源码分析 djangorestframework框架之APIView源码分析

    1 CBV的源码分析 #视图 class login (View): pass #路由 url(r'^books/$', views.login.as_view()) #阅读源码: #左侧工程栏--- ...

  3. Django rest framework框架——APIview源码分析

    一.什么是rest REST其实是一种组织Web服务的架构,而并不是我们想象的那样是实现Web服务的一种新的技术,更没有要求一定要使用HTTP.其目标是为了创建具有良好扩展性的分布式系统. 可用一句话 ...

  4. Restful规范-APIView源码分析

    目录 一.Restful规范 十条规范 二.drf的简单使用 三.APIView源码分析 CBV源码分析 APIView源码分析 一.Restful规范 Restful规范是一种web API接口的设 ...

  5. django Rest Framework----APIView 执行流程 APIView 源码分析

    在django—CBV源码分析中,我们是分析的from django.views import View下的执行流程,这篇博客我们介绍django Rest Framework下的APIView的源码 ...

  6. cbv+resful+APIView源码分析

    CBV源码分析 1概念:什么是cbv和fbv 已经什么是API class bass View ---基于类的视图 function bass View ---基于函数的视图 API(Applicat ...

  7. 探索drf执行流程之APIView源码分析

    Django REST framework 简介 现在新一代web应用都开始采用前后端分离的方式来进行,淘汰了以前的服务器端渲染的方式.而实现前后端分离是通过Django REST framework ...

  8. drf的基本使用、APIView源码分析和CBV源码拓展

    cbv源码拓展 扩展,如果我在Book视图类中重写dispatch方法 -可以实现,在get,post方法执行之前或者之后执行代码,完成类似装饰器的效果 def dispatch(self, requ ...

  9. CBV和APIView源码分析

    CBV源码分析 查看源码的方式,先查看自身,没有去找父类,父类没有就去找父父类... 自己定义的类 class Author(View): def get(self,request): back_di ...

  10. DRF中的APIView源码分析

    首先写一个简单的drf接口 from rest_framework.views import APIView from rest_framework.response import Response ...

随机推荐

  1. P1494 [国家集训队]小Z的袜子(莫队)

    题目链接:https://www.luogu.org/problemnew/show/P1494 题目大意:中文题目 具体思路:计算概率的时候,每一次是区间的移动,每一次移动,记得先将原来的记录的影响 ...

  2. mysql 查询优化 ~ explain与索引失效

    一 explain  1 扫描行数根据的是表的统计元数据  2 索引的元数据具体指的就是show index from查到的索引的区分度,索引的区分度越高越好   3 表的元数据是定期收集,所以可能不 ...

  3. java程序中默认整形值常量是什么类型的?如何区分不同类型的整型数值常量?

    java程序中默认整形值常量是什么类型的?如何区分不同类型的整型数值常量? 整数值默认就是int类型,只有在数值常量后面加“L”或“l”才表明该常量是long型

  4. centos系统下安装python3以及pip3

    首先查看一下系统当前的python版本 python -V 1.安装必要工具 yum-utils 它的功能是管理repository及扩展包的工具yum install yum-utils -y 2. ...

  5. 自动配置redis主从和哨兵

    redis shell  每次创建redis主从和哨兵服务,文件夹要复制好几个,配置文件改一大堆.繁琐还容易出错,就想通过shell脚本自动帮我配置好端口以及文件,下面就是脚本内容: redis-to ...

  6. 【转】Python的神奇方法指南

    [转]Python的神奇方法指南 有关Python内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象.Picklin ...

  7. Faster_RCNN 1.准备工作

    总结自论文:Faster_RCNN,与Pytorch代码: 代码结构:  simple-faster-rcnn-pytorch.py data __init__.py dataset.py util. ...

  8. windowns下excel2013快速生成月报表

    作者:邓聪聪 windowns下excel快速生成月报表,省去了手工复制繁琐的过程 Sub AutoCopySheets() Dim i, j As Integer i = 1 j = 11 For ...

  9. python3+selenium入门03-操作谷歌浏览器

    操作谷歌浏览器同样也需要下载相应的driver插件,官网下载.也可以从我的网盘下载,不过可能不是最新的,网盘地址.打开谷歌浏览器的操作和火狐的差不过. from selenium import web ...

  10. vs 快捷键操作

    各个版本可能不同,以vs 2013为例. 1.调试时,调出即时窗口:[Ctrl+Alt+i] 2.注释/取消注释:[Ctrl+K Ctrl+C]/[Ctrl+K Ctrl+U]