## 13.1 REST
REST这个词,是[Roy Thomas Fielding](http://en.wikipedia.org/wiki/Roy_Fielding)在他2000年的[博士论文](http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm)中提出的,Fielding是一个非常重要的人,他是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席。所以,他的这篇论文发表后,就引起了关注,并且对互联网开发产生了深远的影响。
Fielding将他对互联网软件的架构原则,定名为REST,即Representational State Transfer的缩写,翻译是"表现层状态转化"。如果一个架构符合REST原则,就称它为RESTful架构。
要理解RESTful架构,最好的方法就是去理解Representational State Transfer这个词组到底是什么意思,它的每一个词代表了什么涵义。如果你把这个名称搞懂了,也就不难体会REST是一种什么样的设计。
* 资源(Resources)
REST的名称"表现层状态转化"中,省略了主语。"表现层"其实指的是"资源"(Resources)的"表现层"。
所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。
* 表现层(Representation )
"资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式,叫做它的"表现层"(Representation) 比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。
URI只代表资源的实体,不代表它的形式。严格地说,有些网址最后的".html"后缀名是不必要的,因为这个后缀名表示格式,属于"表现层"范畴,而URI应该只代表"资源"的位置。它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对"表现层"的描述,不过在大部分应用里,通过后缀区分表现层已经足够了
* 状态转化(State Transfer)
访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。
互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。
客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,有常用5个表示操作方式的动词:GET、POST、PUT、DELETE,PATCH。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源,PATCH 用来更新资源部分属性。
> URI (Uniform Resource Identifier)是统一资源标示符,如http://baidu.com,ftp://xxxx.而URL(Uniform Resource Locator)统一资源定位符,是较早的概念,专门用于HTTP协议。
>
> 这一小节REST定义参考了 阮一峰对REST的理解以及百度词条。
- 再版说明
- 13 REST
- 13.1 REST
- 13.1.1 REST 风格的架构
- 13.1.2 使用api作为上下文
- 13.1.3 增加一个版本标示
- 13.1.4 标识资源
- 13.1.5 确定HTTP METHOD
- 13.1.6 确定HTTP Status
- 13.1.7 REST VS WebService
- 13.2 SpringBoot Rest集成
- 13.2.1 集成REST
- 13.2.2 @RestController
- 13.2.3 REST Client
- 13.3 Swager UI
- 13.3.2 集成Swager UI
- 13.3.3 OpenAPI 规范
- 13.3.4 接口描述
- 13.3.5 查询参数描述
- 13.3.6 URI中的参数
- 13.3.7 HTTP 头参数
- 13.3.8 表单参数
- 13.3.9 整个请求体作为参数
- 14 MongoDB
- 14.1 安装MongoDB
- 14.2 使用shell
- 14.2 .1 指定数据库
- 14.2.2 插入文档
- 14.2.3 查询文档
- 14.2.4 更新操作
- 14.2.5 删除操作
- 14.3 Spring Boot集成
- 14.4 增删改查
- 14.4.1 增加API
- 14.4.2 根据主键查询API
- 14.4.3 查询API
- 14.4.4 修改API
- 14.4.5 删除API
- 14.4.6 使用MongoDatabase
- 14.4.7 打印日志
- 14.5 使用Spring Data
- 15 Redis
- 15.1 安装Redis
- 15.2 使用redis-cli
- 15.2 .1 安全设置
- 15.2.2 基本操作
- 15.2.3 Keys
- 15.2.3 Redis List
- 15.2.4 Redis Hash
- 15.2.5 Set
- 15.2.6 Pub&Sub
- 15.3 Spring Boot 集成
- 15.4 使用StringRedisTemplate
- 15.4.1 opsFor
- 15.4.2 绑定key的操作
- 15.4.3 RedisConnection
- 15.4.4 Pub&Sub
- 15.4.5 Pipeline
- 15.5 序列化策略
- 15.5.1 默认序列化策略
- 15.5.2 自定义序列化策略
- 16 Elastic Search
- 16.1 Elastic Search 介绍
- 16.1.1Elastic 安装
- 16.2.1 创建Index
- 16.2.2 添加文档
- 16.2.3 根据主键查询
- 16.2.4 根据主键更新
- 16.2.5 根据主键删除
- 16.2.6 搜索文档
- 16.2.7 联合多个索引搜索
- 16.2.8 Mapping
- 16.2.9 路由
- 16.3 使用RestTemplate 访问ES
- 16.3.1 创建Book
- 16.3.2 使用RestTemplate 获取搜索结果
- 16.4 Spring Data Elastic
- 16.4.1 安装Spring Data
- 16.4.2 编写entity
- 15.4.3 编写Dao
- 16.4.4 编写Controller
- 17 Cache
- 17.1 关于Cache
- 17.1.1 Cache 组件和概念
- 17.1.2 Cache的单机应用
- 17.1.3 使用专有的Cache服务器
- 17.1.4 使用一二级缓存服务器
- 17.2 Spring Boot Cache
- 17.2.1 集成Spring cache
- 17.3 注释驱动缓存
- 17.3.1 @Cacheable
- 17.3.2 KEY生成器
- 17.3.2 @CachePut
- 17.3.3 @CacheEvict
- 17.3.4 @Caching
- 17.3.5 @CacheConfig
- 17.4 使用Redis Cache
- 17.4.1集成Redis 缓存
- 17.4.2 禁止缓存
- 17.4.3 定制缓存
- 17.4. 5 Redis缓存原理
- 17.5 实现Redis 俩级缓存
- 17.5.1 实现 TwoLevelCacheManager
- 17.5.2 创建RedisAndLocalCache
- 17.5.3 缓存同步说明
- 17.5.4 将代码组合在一起
- 18 Spring Session
- 18.1 水平扩展实现
- 18.2 nginx 安装和配置
- 18.2.1 安装nginx
- 18.2.2 配置nginx
- 18.3 Spring Session
- 18.3.1 Spring Session介绍
- 18.3.2 使用Redis
- 18.3.3 Nginx+Redis
- 19 SpringBoot 和 Zookeeper
- 19.1 Zookeeper
- 19.1.1 zookeeper 数据结构
- 19.1.2 Zookeeper 安装
- 19.1.3 zookeeper 基本命令
- 19.1.4 领导选取演示
- 19.1.5 分布式锁演示
- 19.1.6 服务注册演示
- 19.2 Spring boot 集成zookeeper
- 19.2.1 集成 Curator
- 19.2.2 Curator api
- 19.3 分布式锁实现
- 19.4 服务注册
- 19.4.1 服务注册
- 19.4.2 获取服务
- 19.5 领导选取
- 19.6 屏障
- 20 监控SpringBoot应用
- 20.1 安装Acutator
- 20.2 HTTP 跟踪
- 20.3 日志查看
- 20.4 线程栈信息
- 20.5 内存信息
- 20.6 查看URL映射
- 20.7 查看Spring管理Bean
- 20.8 其他监控
- 20.9 编写自己的监控信息
- 20.9.1 编写HealthIndicator
- 20.9.2 自定义监控。