## 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 自定義監控。