RESTful
RESTful起源
REST(Representational State Transfer)表象化狀態轉變(表述性狀態轉變),在2000年被提出,基於HTTP、URI、XML、JSON等標准和協議,支持輕量級、跨平台、跨語言的架構設計。是Web服務的一種新的架構風格(一種思想)。
RESTful架構的主要原則
- 對網絡上所有的資源都有一個資源標志符。
- 對資源的操作不會改變標識符。
- 同一資源有多種表現形式(xml、json)
- 所有操作都是無狀態的(Stateless)
符合上述REST原則的架構方式稱為RESTful
RESTful介紹
RESTful是一種常見的REST應用,是遵循REST風格的web服務,REST式的web服務是一種ROA(面向資源的架構)。
簡單的說:RESTful是一種架構的規范與約束、原則,符合這種規范的架構就是RESTful架構。
RESTful規范與約束
RESTful 架構的核心規范與約束:統一接口
分為四個子約束:
1.每個資源都擁有一個資源標識,每個資源的資源標識可以用來唯一地標明該資源
2.消息的自描述性
3.資源的自描述性。
4.HATEOAS Hypermedia As The Engine Of Application State(超媒體作為應用狀態引擎)
即客戶只可以通過服務端所返回各結果中所包含的信息來得到下一步操作所需要的信息,如到底是向哪個URL發送請求等。也就是說,一個典型的REST服務不需要額外的文檔標示通過哪些URL訪問特定類型的資源,而是通過服務端返回的響應來標示到底能在該資源上執行什么樣的操作
目的:實現客戶端無需借助任何文檔即能調用到所有的服務器資源
REST資源操作
http方法 | 資源操作 | 冪等 | 安全 |
---|---|---|---|
GET | SELECT | 是 | 是 |
POST | INSERT | 否 | 否 |
PUT | UPDATE | 是 | 否 |
DELETE | DELETE | 是 | 否 |
RESTful中根據操作資源的不同,使用不同的http方法,其傳輸的媒介一般使用json
RESTful設計准則
賓語必須是名詞
賓語就是 API 的 URL,是 HTTP 動詞作用的對象。它應該是名詞,不能是動詞。比如,/articles這個 URL 就是正確的,而下面的 URL 不是名詞,所以都是錯誤的。
/getAllCars
/createNewCar
/deleteAllRedCars
復數URL
既然 URL 是名詞,那么應該使用復數,還是單數?
這沒有統一的規定,但是常見的操作是讀取一個集合,比如GET /articles(讀取所有文章),這里明顯應該是復數。
為了統一起見,建議都使用復數 URL,比如GET /articles/2要好於GET /article/2。
避免多級URL
常見的情況是,資源需要多級分類,因此很容易寫出多級的 URL,比如獲取某個作者的某一類文章。
GET /authors/12/categories/2
1
這種 URL 不利於擴展,語義也不明確,往往要想一會,才能明白含義。
更好的做法是,除了第一級,其他級別都用查詢字符串表達。
GET /authors/12?categories=2
1
下面是另一個例子,查詢已發布的文章。你可能會設計成下面的 URL。
GET /articles/published
1
查詢字符串的寫法明顯更好。
GET /articles?published=true
接口示例
傳統的URL:
http://127.0.0.1/user/query/1 GET 根據用戶id查詢用戶數據
http://127.0.0.1/user/save POST 新增用戶
http://127.0.0.1/user/update POST 修改用戶信息
http://127.0.0.1/user/delete GET/POST 刪除用戶信息
RESTful格式:
http://127.0.0.1/user/{id} GET 根據用戶id查詢用戶數據
http://127.0.0.1/user POST 新增用戶
http://127.0.0.1/user PUT 修改用戶信息
http://127.0.0.1/user DELETE 刪除用戶信息 OR http://127.0.0.1/user/{id} DELETE 刪除用戶信息
RESTful實踐
查詢
新增
更新
刪除
RESTful狀態碼
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)- 服務當前無法處理請求
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)- 服務端當前無法處理請求
至此,RESTful的介紹和使用已經完成,RESTful已在各互聯網公司接口定義中,成為主流的范式,RESTful減少了傳統請求的拆裝箱操作,結構清晰,在接口定義中受到前后端開發者的青睞。
以上四篇文章都是質量非常之高的,以上內容只是為了個人查看方便,侵權請聯系刪除!