【 js 基础 】【 源码学习 】backbone 源码阅读(三)浅谈 REST 和 CRUD
最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-study)进行参考交流,有详细的源码注释,以及知识总结,同时 google 一下 backbone 源码,也有很多优秀的文章可以用来学习。
我这里主要记录一些偏设计方向的知识点。这篇文章主要讲 backbone.sync 中用到的 Rest 和 CRUD。
首先我们简单了解一下 REST:
REST : Representational State Transfer,即表述性状态转移,是一种架构设计风格,Web服务实现方案之一,目的是便于不同软件/程序在网络(例如互联网)中互相传递信息。
这个设计风格的要求有以下6点:
    a、客户-服务器(Client-Server)
通信只能由客户端单方面发起,表现为客户端请求-服务器响应的形式。
    b、无状态(Stateless)
通信的会话状态(Session State)应该全部由客户端负责维护。
    c、缓存(Cache)
响应内容可以在通信链的某处被缓存,以改善网络效率。
    d、统一接口(Uniform Interface)
通信链的组件之间通过统一的接口相互通信,以提高交互的可见性。
    e、分层系统(Layered System)
通过限制组件的行为(即每个组件只能“看到”与其交互的紧邻层),将架构分解为若干等级的层。
    f、按需代码(Code-On-Demand,可选)
支持通过下载并执行一些代码(例如Java Applet、Flash或JavaScript),对客户端的功能进行扩展。
以上来自 wiki (https://zh.wikipedia.org/wiki/REST),看起来比较难懂。
我们通过 backbone 中 sync 模块对其的应用来理解, 在 sync 模块中,使用了 基于 REST 设计风格的 http 服务在 backbone 的 model(负责数据模块) 上执行 CRUD 操作。
所谓 http 服务,它只做两件事:处理 http 请求和发送 http 响应。
而对于 REST 本身是一种设计风格,他告诉我们如何使用 http 协议,重点体现在 接口API 的设计上。
当我们设计的接口满足 REST 约束条件和原则,就称为它是 RESTful API(RESTful相当于一个形容词)。
我们来举两个我们经常会接触到的 api 以及 http 请求(GET、POST):
1、GET 例子:博客园获取“我的博客”页面(“我的博客”链接地址:http://www.cnblogs.com/lijiayi/)

来看一下浏览器向服务器发起的请求报文:


重点是第一行
GET /lijiayi/ HTTP/1.1

来看一下浏览器向服务器发起的请求报文:

重点是第一行
POST /ajax/msg/send HTTP/1.1
同样
POST : 表示请求的方法。
/ajax/msg/send: 请求路径。
HTTP/1.1:协议以及版本。
以上是我们最常见的请求方式,非 RESTful API。
而在 backbone 的 sync 中,则让我们这样请求接口:
Backbone.sync(method, model, [options])
sync 接受三个参数,其中 method 参数传入 CRUD 方法 即"create", "read", "update", “delete”以及“patch”,而他们则对应了http请求方法的“POST”、“GET”、“PUT”、“DELETE”和“PATCH”。

/questions //查看所有的问题列表
/questions/:id //操作 ID 为 id 的问题
只需要上面两个路由,我们就可以查看所有的问题,并对其中一个进行操作,这个操作包括增删改查,对于我们具体要执行什么操作,就是由上面的 method 也就是不同的 http 方法来控制的。而这种 api 的设计就是符合 RESTful API。
你大概有个认识了,咱们系统的在说一下:
符合REST设计风格的Web API称为RESTful API。它要求我们拥有:
1、直观简短的请求地址:比如:http://example.com/resources/。
2、对于我们请求的资源的表现形式可以是XML、HTML或者 Json等。
3、对资源的操作:用 http 方法来实现,或者说是表达(比如:POST,GET,PUT或DELETE)。
也就是说 用 URL定位资源,用 HTTP 动词(GET,POST,DELETE,PUT)描述操作。(来自知乎 https://www.zhihu.com/question/28557115/answer/41265890)
通常:
| URL | GET | POST | DELETE | PUT | 
| 
 一组资源:  | 
获取该资源组中的所有资源详细信息 | 在本组资源中创建/追加一个新的资源 | 删除资源组 | 使用给定的一组资源替换当前的资源组 | 
| 
 单个资源:  | 
获取指定的资源的详细信息 | 
 把指定的资源当做一个资源组, 并在其下创建/追加一个新的元素,使其隶属于当前资源  | 
删除资源组中特定的资源 | 
 替换/创建指定的资源, 并将其增加到相应的资源组  | 
【 js 基础 】【 源码学习 】backbone 源码阅读(三)浅谈 REST 和 CRUD的更多相关文章
- 【 js 基础 】【 源码学习 】源码设计 (更新了backbone分析)
		
学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析 第二部分:unders ...
 - 【 js 基础 】【 源码学习 】源码设计 (持续更新)
		
学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析第二部分:undersc ...
 - Vue2.x源码学习笔记-源码目录结构整理
		
先从github上下载或者clone一个vue分支项目 https://github.com/vuejs/vue 查看下目录结果 先列出一些目录 Vue |— build 打包相关的配置文件,其中最重 ...
 - 【iScroll源码学习02】分解iScroll三个核心事件点
		
前言 最近两天看到很多的总结性发言,我想想今年好像我的变化挺大的,是不是该晚上来水一发呢?嗯,决定了,晚上来水一发! 上周六,我们简单模拟了下iScroll的实现,周日我们开始了学习iScroll的源 ...
 - Java并发包源码学习之AQS框架(三)LockSupport和interrupt
		
接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...
 - 【JS基础语法】---学习roadmap---6 parts
		
JS基础语法---roadmap Part 1 - 2: Part 3 - 4: Part 5 - 6
 - VUE 源码学习01 源码入口
		
VUE[version:2.4.1] Vue项目做了不少,最近在学习设计模式与Vue源码,记录一下自己的脚印!共勉!注:此处源码学习方式为先了解其大模块,从宏观再去到微观学习,以免一开始就研究细节然后 ...
 - async源码学习 - 全部源码
		
因为工作需要,可能我离前端走远了,偏node方向了.所以异步编程的需求很多,于是乎,不得不带着学习async了. 我有个习惯,用别人的东西之前,喜欢稍微搞明白点,so就带着看看其源码. github: ...
 - Thrift 源码学习一——源码结构
		
Thrift 客户端与服务端的交互图 源码结构 传输层 TTransport: TTransport:客户端传输层抽象基础类,read.write.flush.close 等方法 TSocket 与 ...
 
随机推荐
- MySQL缓存之Qcache与buffer pool对比
			
Q:innodb buffer pool和Qcache的缓存区别? A: 1.Qcacche缓存的是SQL语句及对应的结果集,缓存在内存,最简单的情况是SQL一直不重复,那Qcache的命令率肯定是0 ...
 - raft如何实现leadership transfer
			
leadership transfer可以把raft group中的leader身份转给其中一个follower.这个功能可以用来做负载均衡,比如可以把leader放在性能更好的机器或者离客户端更近的 ...
 - 关于shell脚本函数、数组、字符串截取、svn更新发布实例
			
#/bin/bash #功能:QA服根据模板创建区配置文件并提交到svn上. SOURCE_PATH=/data/source_code SVN_PATH=/code/psm #svn发布目录,要 ...
 - 一个简单、易用的Python命令行(terminal)进度条库
			
eprogress 是一个简单.易用的基于Python3的命令行(terminal)进度条库,可以自由选择使用单行显示.多行显示进度条或转圈加载方式,也可以混合使用. 示例 单行进度条 多行进度条 圆 ...
 - Docker初步了解
			
Docker 是什么 https://www.docker.com/ Docker 这个单词英文原意是码头工人,搬运工的意思,这个搬运工搬运的是各种应用的容器. 官方的说法是,Docker 是提供给开 ...
 - PHP环境搭建——Apache
			
1.PHP环境安装前我们需要知道PHP给我们带来的功能是什么? Php主要用在三个领域 (1) 网站和web应用程序 (2) 命令行脚本 (3) 桌面(GUI)应用 ...
 - ES6中的模块
			
前面的话 JS用"共享一切"的方法加载代码,这是该语言中最容出错且容易令人感到困惑的地方.其他语言使用诸如包这样的概念来定义代码作用域,但在ES6以前,在应用程序的每一个JS中定义 ...
 - JVM学习笔记三:垃圾收集器及内存管理策略
			
垃圾收集器 上文说到了垃圾收集算法,这次我们聊一下HotSpot的具体垃圾收集器的实现,以JDK1.7为例,其包含的可选垃圾收集器如下图: 不同收集器之间的连线,代表它们可以搭配使用,收集器所属的区域 ...
 - 如何让Oracle释放undo表空间
			
如何让Oracle释放undo表空间 最佳答案 在日常的数据库维护和数据库编程中经常会遇到犹豫对大数据量做DML操作后是得ORACLE的undo表空间扩展到十几个G或者几十个G 但是这些表空间 ...
 - 40. leetcode 202. Happy Number
			
Write an algorithm to determine if a number is "happy". A happy number is a number defined ...