Restful API
文章目錄
簡單記錄 - Restful API實戰
Q:如何做到業務邏輯“一次編寫,隨時接入”?
A:通過遠程調用API ,比較火的方案是“RESTful API”
RESTful是什么,簡單來說,RESTful API 是基於HTTP協議產生的一種相對簡單的API設計方案,屬於無狀態傳輸。下面介紹RESTful是什么-為什么-怎么使用
1、REST是什么以及它的 6 個限制
要想知道Restful是什么,先來了解下REST是什么吧。
REST是什么?
REST是什么?
- 萬維網軟件架構風格
- 用來創建網絡服務
起源:REST,是Roy Thomas Fielding在他2000年的博士論文中提出的。
REST,即Representational State Transfer的縮寫, “表現層狀態轉化”。
表現層(Representation):
我們把"資源"具體呈現出來的形式,叫做它的"表現層"(Representation)。
比如文本可以用txt格式表現,也可以使用JSON格式、二進制格式表現。
狀態轉化(State Transfer):
數據和狀態的變化
HTTP協議里面,POST、DELETE、PUT、GET增刪改查,對應四種基本操作:
-
POST用來新建資源
-
DELETE用來刪除資源
-
PUT用來更新資源
-
GET用來獲取資源
數據在互聯網進行傳輸
REST的6個限制
依然不明白REST?
那通過REST的6個限制詳細了解它
客戶-服務器(Client-Server)
- 關注點分離
- 服務端專注數據存儲,提升了簡單性
- 前端專注用戶界面,提升了可移植性
數據存儲 用戶交互
無狀態(Stateless)
- 所有用戶會話信息都保存在客戶端
- 每次請求必須包括所有信息,不能依賴上下文信息
- 服務端不用保存會話信息,提升了簡單性、可靠性、可見性
緩存的作用
緩存(Cache)
- 所有服務端響應都要被標為可緩存或不可緩存
- 減少前后端交互,提升了性能
統一接口(Uniform Interface)
- 接口設計盡可能統一通用,提升了簡單性、可見性
- 接口與實現解耦,使前后端可以獨立開發迭代
分層系統(Layered System)
- 每層只知道相鄰的一層,后面隱藏的就不知道了
- 客戶端不知道是和代理還是真實服務器通信
- 其他層:安全性、負載均衡、緩存層等
按需代碼(Code - On - Demand 可選)
- 客戶端可以下載運行服務器傳來的代碼(比如 JS)
- 通過減少一些功能,簡化了客戶端
統一接口的限制
資源的標識
- 資源是如何可以命名的事物,比如用戶、評論等
- 每個資源可以通過URI被唯一地標識
- https://api.github.com/users
- https://api.github.com/users/liuawen
URI 統一資源標識符(Uniform Resource Identifier)
URL 統一資源定位器 (Uniform Resource Locator)
URI 唯一標識
網上的資源唯一地標識
提供表述來操作資源
- 表述就是Representation ,比如JSON、XML等
- 客戶端不能直接操作(比如SQL)服務端資源
- 客戶端應該通過表述(比如JSON)來操作資源
https://developer.github.com/v3/repos/
自描述信息
-
每個消息(請求或響應)必須提供足夠的信息讓接受者理解
-
媒體類型(application/json、application/xml)
-
HTTP方法:GET(查)、POST(增)、DELECT(刪)
-
是否緩存:Cache-Control
HTTP verbs
HTTP協議 標准
超媒體作為應用狀態引擎
-
超媒體:帶文字的鏈接
-
應用狀態:一個網頁
-
引擎:驅動、跳轉
-
合起來:點擊鏈接跳轉到另一個網頁
2、 Restful是什么
Restful定義以及Restful對於資源的定義
Restful是什么
RESTful架構,就是目前流行的一種互聯網軟件架構
Restful
如果一個架構符合REST原則,就稱它為RESTful架構。
符合REST架構風格的API
本質:一種軟件架構風格
核心:面向資源
解決的問題:
- 降低開發的復雜性
- 提高系統的可伸縮性
RESTful API具體什么樣子?
基本的URI,如 https://api.github.com/users
標准HTTP方法,如GET,POST,PUT,PATCH,DELETE
傳輸的數據媒體類型,如JSON,XML
現實舉例
-
GET / users # 獲取users列表
-
GET /users/12# 查看某個具體的user
-
POST/users# 新建一個user
-
PUT /users/12# 更新user12
-
DELETE/users/12# 刪除user12
從資源出發
從資源出發
設計概念和准則
- 網絡上的所有事物都可以被抽象為資源。
- 每一個資源都有唯一的資源標識,對資源的操作不會改變這些標識。
- 所有的操作都是無狀態的。
資源
Q:那什么是資源呢?
A:所謂“資源”,就是網絡上的一個實體,或者說是網絡上的一個具體信息,可以是文本、圖片、視頻等
每種資源對應一個特定的URI(統一資源標識符(Uniform Resource Identifier))。要獲取這個資源,訪問它的URI就可以,因此URI就成了每一個資源的地址或獨一無二的識別符。
3、為什么要使用Restful
HTTP協議-URL
HTTP是一個屬於應用層的協議,特點是簡捷、快速。
schema://host[:port]/path[?quert-string] [#anchor]
-
schema 指定底層使用的協議(例如:http,https,ftp)
-
host 服務器的IP地址或者域名
-
port 服務器端口,默認為80
-
path 訪問資源的路徑
-
query0string 發送給http服務器的數據
-
anchor 錨
HTTP協議-請求
HTTP協議-請求
組成格式:請求行、消息報頭、請求正文
請求行
格式如下:Method Request-URI HTTP-Version CRLF
舉例
GET / HTTP / 1.1 CRLF
請求方法
- GET 請求獲取Request-URI所標識的資源
- POST 在Request-URI所標識的資源后附加新的數據
- HEAD 請求獲取由Request-URI所標識的資源的響應消息
獲取
發送數據
- PUT 請求服務器存儲一個資源 ,並用Request-URI作為其標識
- DELETE 請求服務器刪除Request-URI所標識的資源
- OPTIONS 請求查詢服務器的性能,或者查詢與資源相關的選項和需求
HTTP協議-響應
HTTP協議-響應
組成格式:狀態行、消息報頭、響應正文
狀態行
HTTP-Version Status-Code Reason-Phrase CRLF
HTTP/1.1 200 OK
常用狀態碼
-
200 OK //客戶端請求成功
-
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
-
401 Unauthorized //服務器收到請求,但是拒絕提供服務
-
404 Not Found //請求資源不存在
5xx服務器錯誤
- 500 Internal Server Error //服務器發生不可預期的錯誤
- 503 Server Unavailable //服務器當前不能處理客戶端的請求
404 Not Found
RESTful架構與其他架構的區別
SOAP WebService
WebService是一種跨編程語言和跨操作系統平台的遠程調用技術
WebService通過HTTP協議發送請求和接受結果時采用XML格式封裝,並增加了一些特定的HTTP消息頭,這些特定的HTTP消息頭和XML內容格式就是SOAP協議。
WebService 、SOAP協議、RESTful架構與WebService
RESTful架構與其他架構的區別
效率和易用性
SOAP由於各種需求不斷擴充本身協議的內容,導致在SOAP處理方面的性能有所下降。同時在易用性方面以及學習成本上也有所增加。
RESTful由於其面向資源接口設計以及操作抽象簡化了開發者的不良設計,同時也最大限度的利用了Http最初的應用協議設計理念。
安全性
RESTful對於資源型服務接口來說很合適,同時特別適合對於效
率要求很高,但是對於安全要求不高的場景。
SOAP的成熟性可以給需要提供給多開發語言的, 對於安全性
要求較高的接口設計帶來便利。所以覺得純粹說什么設計模
式將會占據主導地位沒有什么意義,關鍵還是看應用場景。
restful適合做什么開發
接口或者應用
4、 如何使用Restful
如何設計RESTful API
-
資源路徑(URI)
-
HTTP動詞
-
過濾信息
-
狀態碼
-
錯誤處理
-
返回結果
請求設計規范
- URI使用名詞,盡量用復數,如/users
- URI使用嵌套表示關聯關系,如 /users/12/repos/5
- 使用正確的HTTP方法,如GET/POST/PUT/DELETE
- 不符合CRUD的情況:POST/action/子資源
資源路徑
在RESTful架構中,每個網址代表一種資源,所以網址中不能有動詞,只能有名詞,一般來說API中的名詞應該使用復數。goods、users等。
舉例
舉例來說,有一個API提供動物園( zoo )的信息,還包括各種動物和雇員的信息。則它的路徑應該設計成下面這樣。
https://api.example.com/v1/zoos
//動物園資源
https://api.example.com/v1/animals
//動物園資源
https://api.example.com/v1/employees
//動物園資源
v1版本、http請求頭中 或者 名詞復數
獲取一個動物 animals/id=1
資源的設計
http 動詞 四種操作 創建 更新 讀取 刪除
HTTP動詞
對於資源的操作(CURD),由HTTP動詞(謂詞)表示
-
GET:從服務器取出資源(一項或多項)。
-
POST:在服務器新建一個資源。
-
PUT:在服務器更新資源(客戶端提供改變后的完整資源)
-
PATCH:在服務器更新資源(客戶端提供改變的屬性)。
-
DELETE:從服務器刪除資源。
put更新資源 patch只會返回更新的數據 比如改密碼 密碼變了就返回密碼。
舉例
-
POST /zoos:新建一個動物園
-
GET /zoos/ID:獲取某個指定動物園的信息
-
PUT /zoos/ID: 更新某個指定動物園的信息
-
DELETE /zoos/ID:刪除某個動物園
刪除動物園,動物園里的動物都刪除
POST新建 GET 獲取 PUT 更新 DELETE 刪除
過濾信息
如果記錄數量很多,服務器不可能都將它們返回給用戶。
API應該提供參數,過濾返回結果。
過濾信息,某個常數。
舉例
- ?offset=10:指定返回記錄的開始位置。
- ?page=2&per_page=100:指定第幾頁,以及每頁的記錄數。
- ?sortby=name&order=asc:指定返回結果排序,以及排序順序。
- ?animal_type_id=1:指定篩選條件。
過濾信息
用戶自己設計的
offset開始位置
狀態碼
標准的
服務器向用戶返回的狀態碼和提示信息,使用標准HTTP狀態碼。
- 200 OK 服務器成功返回用戶請求的數據,該操作是冪等的。
- 201 CREATED created 新建或修改數據成功
- 204 NO CONTENT 刪除數據成功
200 OK
201新建修改204刪除,用得比較少的。
- 400 BAD REQUEST request 用戶發出的請求有錯誤,該操作是冪等的。
- 401 Unauthorized 表示用戶沒有認證,無法進行當前操作。
- 403 Forbidden 表示用戶訪問是被禁止的。
客戶端的請求有問題
401 沒有認證
403 提供了 但參數不足 或者權限不夠
- 422 Unprocesable Entity 當創建一個對象時,發生一個驗證錯誤。
- 500 INTERNAL SERVER ERROR internal server error 服務器發生錯誤,用戶將無法判斷發出的請求是否成功。
422
驗證錯誤 后端需要用戶名 密碼 前端只提供了一個用戶名 錯誤了 密碼不能為空
500
服務器錯誤
錯誤處理
422 參數錯誤 500
錯誤處理
輸出JSON格式錯誤信息
如果狀態碼是4xx或者5xx,就應該向用戶返回出錯信息。一般來說,返回的信息中將error作為鍵名,出錯信息作為鍵值即可
{
"error":"參數錯誤"
}
返回結果
輸出JSON數組或JSON對象
返回結果
針對不同操作,服務器向用戶返回的結果應該符合以下規范:
-
GET/collections:返回資源對象的列表(數組)
-
GET/collections/identity:返回單個資源對象
-
POST/collections:返回新生成的資源對象。
-
PUT/collections/identity:返回完整的資源對象
-
PATCH/collections/identity:返回被修改的屬性
-
DELECT/collections/identity:返回一個空文檔
不存在返回404
參數
PUT 完整的 PATCH更新的
DELETE 空的
設計RESTful API
表單不是只支持GET和POST提交么。那怎么支持put、delete請求方式呢不懂?
HTTP/1.1協議中共定義了八種方法(有時也叫“動作”)來表明Request-URI指定的資源的不同操作方式:具體方法可以上網查詢
你說的表單指的是form表單吧,method 屬性規定如何發送表單數據(表單數據發送到 action 屬性所規定的頁面)。表單數據可以作為 URL 變量(method=“get”)或者 HTTP post (method=“post”)的方式來發送。
5、 小結
RESTful設計要素
RESTful應用場景
基於HTTP請求頭的身份認證
REST,即Representational State Transfer的縮寫, “表現層狀態轉化”。
如果一個架構符合REST原則,就稱它為RESTful架構。
解決的問題:
- 降低開發的復雜性
- 提高系統的可伸縮性
基本的URI,如 https://api.github.com/users
標准HTTP方法,如GET,POST,PUT,PATCH,DELETE
傳輸的數據媒體類型,如JSON,XML
去選擇 不能因為restful而restful 嗯嗯
6、參考資料
1、 理解RESTful架構