因為這次開發要遵循restful進行開發,所以在學習http的各種請求時,插入對restful知識的學習。哎~生命不息。學習不止啊~ 累且堅強啊~
廢話不多說進入正題... ...
**安全方法**是指不修改資源的HTTP方法,更準備的說法是其不改變資源表示形式的HTTP方法。但是仍然可能改變服務器上的內容或資源,但這必須導致有不同的表現形式。
| 方法 | 安全性 |
| --- | --- |
| get | yes |
| put | no |
| post | no |
| delete | no|
| head| yes |
| patch| yes |
| options| yes |
詳細解釋:
**GET**:用于獲取一個具體的資源或者一個資源列表
**POST**:創建一個新的資源
**PUT**:以整體的方式更新服務器上的一個資源(客戶端提供改變后的完整資源)
**PATCH**:只更新服務器上的一個資源的一個屬性(客戶端提供改變的屬性)
**DELETE**:刪除一個資源
**HEAD**:獲取一個資源的元數據,例如,指向了解一個資源文件的大小、修改日期等;
**OPTIONS**:用于獲取資源支持的所有http方法(獲取信息,關于資源的哪些屬性是客戶端可以改變的)
*****
## **restful與前端**
RESTful 是一種遵守 REST 設計的架構風格。REST 既不是標準,也不是協議,而是一組架構約束條件和設計指導原則,一種基于HTTP、URI、XML 等現有協議與標準的開發方式。
### **一、REST**
REST它是 Representational State Transfer的縮寫,表示**表述性狀態轉移**,
“表述性”:是“資源”的“表述性”
* **資源**:REST是面向資源的,資源是網絡上的一個實體,可以是一個文件、一張圖像、一首歌曲、甚至是一種服務。資源可以設計得很抽象,但只要是具體信息,就可以是資源,因為資源的本質是**一串二進制數據**。并且每個資源必須有URL,通過URL來找到資源。
* **表述**:資源在某個特定時刻的狀態說明被稱為表述(representation),表述由數據和描述數據的元數據(例如HTTP報文)組成。資源的表述有多種格式,這些格式也被稱為MIME類型,例如文本的txt格式、圖像的png格式、視頻的mk格式等。一個資源可以有多種表述,例如服務器響應一個請求返回的資源可以是JSON格式的數據,也可以是XML格式的數據。
* **表述性狀態轉移**:表述性狀態轉移的目的是操作資源,通過轉移和控制資源的表述就能實現此目的。例如客戶端可以向服務器發送GET請求,服務器將資源的表述轉移到客戶端;客戶端也可以向服務器發送POST請求,傳遞表述改變服務器中的資源狀態。
### **二、約束條件**
REST給出了6種約束條件,通信兩端在遵循這些約束后,就能提高工作效率,改善系統的**可伸縮性**、**可靠性**和**交互的可見性**,還能**促進服務解耦**。
**客戶端-服務器**:客戶端與服務器分離關注點,客戶端關注用戶接口,服務器關注數據存儲客戶端向服務器發起接口請求(獲取數據或提交數據),服務器返回處理好的結果給客戶端,客戶端再根據這些數據渲染界面,同一個接口可以應用于多個終端(例如Web、iOs或 Android)大大改善了接口的可移植性,并且只要接口定義不變,客戶端和服務器可以獨立開發、互不影響。
**無狀態**:兩端通信必須是無狀態的,服務器不會保存上一次請求的會話狀態,會話狀態要全部保存在客戶端,從客戶端到服務器的每個請求都要附帶一些用于理解該請求的信息,例如在后臺管理系中,大部分都是需要身份認證的請求,所以都會附帶用戶登錄狀態。
**緩存**:響應的資源可以被標記為可緩存或禁止緩存,如果可以緩存,那么客戶端可以減少與服務器通信的次數,降低延遲、提高效率。
**統一接口**:統一接口是REST區別于其他架構風格的核心特征,接口定義包括4個部分
1. 資源的識別(identification of resources)也就是用一個URL指向資源,要獲取這個資源,只要訪問它的URL即可,URL就是資源的地址或標識符。REST對URL的命名也有要求,**在URL中不能有動詞,只能由名詞組成**。
2. 通過表述對資源執行操作(manipulation of resources through representations)在表述中包含了操作該資源的指令,例如用HTTP的請求首部 n/firb4, l kn http airhs accept tw&it, HTTP hiit(tn get,指定需要的表述格式,用HTTP方法(如get、POST等)完成對數據的增刪改查工作,用HTTP響應狀態碼表示請求結果。
3. 自描述的消息(self-deive messages)包含如何處理該消息的信息,例如消息所使用的表述格式、能否被緩存等。
4. 作為應用狀態引擎的超媒體(hypermedia as the engine of application state)超媒體并不是一種技術,而是一種策略,建立一種客戶端與服務器之間的對話方式。超媒體可以將資源互相連接,并能描述它們的能力,告訴客戶端如何構建HTTP請求。
**分層系統:**將架構分解為若干層,降低層之間的耦合性。每個層只能和與它相鄰的層進行通信。
**按需代碼:**這是一條可選的約束,支持客戶端下載并執行一些代碼(例如 Java AppletJava或 Flash)進行功能擴展。
### **三、設計 RESTful API需要考慮的幾個方面**
1. 通信用HTPS安全協議。
2. 在URL中加入版本號,例如“vl/animals's
3. URL中的路徑(endpoint)不能有動詞,只能用名詞。
4. 用HTTP方法對資源進行增刪改查的操作。
5. 用HTTP狀態碼傳達執行結果和失敗原因。
6. 為集合提供過濾、排序、分頁等功能。
7. 用查詢字符串或HTTP首部 (7)AifF*f* HTTP # accpet i1tw#t,ti& pETiT.進行內容協商,指定返回結果的數據格式。
8. 及時更新文檔,每個接口都有對應的說明。
```
### 請求方式的舉例:
* GET /zoos:列出所有動物園
* POST /zoos:新建一個動物園
* GET /zoos/ID:獲取某個指定動物園的信息
* PUT /zoos/ID:更新某個指定動物園的信息(提供該動物園的全部信息)
* PATCH /zoos/ID:更新某個指定動物園的信息(提供該動物園的部分信息)
* DELETE /zoos/ID:刪除某個動物園
* GET /zoos/ID/animals:列出某個指定動物園的所有動物
* DELETE /zoos/ID/animals/ID:刪除某個指定動物園的指定動物
```
```
### 一些狀態碼:
* 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 - [*]:服務器發生錯誤,用戶將無法判斷發出的請求是否成功
```
### **四、傳統接口寫法與Restful API區別**
* [ ] 一個文件操作接口,傳統模式:
* api/getfile.php - 獲取文件信息,下載文件
* api/uploadfile.php - 上傳創建文件
* api/deletefile.php - 刪除文件
* [ ] RESTfu,api/file 只需要這一個接口:
* GET 方式請求 api/file - 獲取文件信息,下載文件
* POST 方式請求 api/file - 上傳創建文件
* DELETE 方式請求 api/file - 刪除某個文件