Restful的本質(zhì)
一種基于資源的軟件架構(gòu)風(fēng)格
核心
面向資源設(shè)計(jì)API
解決的問題
- 降低開發(fā)的復(fù)雜性
- 提供系統(tǒng)的可伸縮性
只需設(shè)計(jì)一套相同的后端處理接口,就可以為不同類型的終端(PC、Mobile等)提供服務(wù)。
設(shè)計(jì)概念和準(zhǔn)則
- 網(wǎng)絡(luò)上的所有事物都可以被抽象為資源;
- 每一個(gè)資源都有唯一的資源標(biāo)識(shí),對(duì)資源的操作不會(huì)改變這些標(biāo)識(shí);
- 所有的操作都是無狀態(tài)的(每次操作都是獨(dú)立的,互不關(guān)聯(lián))
資源
網(wǎng)絡(luò)上的一個(gè)實(shí)體,或網(wǎng)絡(luò)上的一個(gè)具體信息(文字、圖片、視頻、音頻等)。
Restful API
從定義上來說,Restful與http協(xié)議無關(guān),但Restful API是基于http協(xié)議的一種實(shí)現(xiàn),所有相關(guān)知識(shí)都是基于現(xiàn)有http協(xié)議而來,并沒有對(duì)http協(xié)議進(jìn)行擴(kuò)充。
http協(xié)議-url
http是一個(gè)屬于應(yīng)用層的協(xié)議,特點(diǎn)是簡(jiǎn)捷、快速。
一個(gè)完整的url組成形式:
schema://host[:port]/path[?query-string][#anchor]
- ==scheme== 指定底層使用的協(xié)議(例如:http,https,ftp)
- ==host== 服務(wù)器的IP地址或域名
- ==port== 服務(wù)器端口,默認(rèn)為80;https的默認(rèn)端口是443
- ==path== 訪問資源的路徑(標(biāo)識(shí)主機(jī)中的所有資源)
- ==query-string== 發(fā)送給http服務(wù)器的數(shù)據(jù)(查詢字符串,一般用于對(duì)資源做篩選操作)
- ==anchor== 錨(直接滾動(dòng)到當(dāng)前頁面的某個(gè)區(qū)域)
http協(xié)議-請(qǐng)求
組成格式:請(qǐng)求行、消息報(bào)頭、請(qǐng)求報(bào)文
請(qǐng)求行
格式如下:Method Request-URL HTTP-Version CRLF
- Method :請(qǐng)求方法
- Request-URL :請(qǐng)求地址
- HTTP-Version :http協(xié)議版本號(hào)
- CRLF :回車換行
舉例
GET / HTTP/1.1 CRLF (請(qǐng)求主機(jī)根目錄下資源的請(qǐng)求頭)
請(qǐng)求成功,則返回資源內(nèi)容。
請(qǐng)求方法
- ==GET== 請(qǐng)求獲取Request-URL所標(biāo)識(shí)的資源;(獲取資源)
- ==POST== 在Request-URL所標(biāo)識(shí)的資源后附加新的數(shù)據(jù);(發(fā)送數(shù)據(jù))
- ==HEAD== 請(qǐng)求獲取由Request-URL所標(biāo)識(shí)的資源的響應(yīng)消息報(bào)頭;
- ==PUT== 請(qǐng)求服務(wù)器存儲(chǔ)一個(gè)資源,并用Request-URL作為其標(biāo)識(shí);(更新資源時(shí)使用)
- ==DELETE== 請(qǐng)求服務(wù)器刪除Request-URL所標(biāo)識(shí)的資源;
- ==OPTIONS== 請(qǐng)求查詢服務(wù)器的性能,或者查詢與資源相關(guān)的選項(xiàng)和需求;(訪問頻率限制參數(shù))
http協(xié)議-響應(yīng)
組成格式:狀態(tài)行、消息報(bào)頭、響應(yīng)正文
狀態(tài)行
HTTP-Version Status-Code Reason-Phrase CRLF
- HTTP-Version :http協(xié)議版本號(hào)
- Status-Code :響應(yīng)狀態(tài)碼
- Reason-Phrase :字面的響應(yīng)內(nèi)容
- CRLF:回車換行
例如:HTTP /1.1 200 OK
常用狀態(tài)碼
- 200 OK //客戶端請(qǐng)求成功 (客戶端請(qǐng)求成功,且服務(wù)端響應(yīng)成功)
- 400 Bad Request //客戶端請(qǐng)求有語法錯(cuò)誤,不能被服務(wù)器所理解
- 401 Unauthorized //服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)(請(qǐng)求的資源需要授權(quán)訪問,但客戶端并未授權(quán))
- 404 Not Found //請(qǐng)求資源不存在
一般來說,以5開頭的狀態(tài)碼都是服務(wù)器內(nèi)部錯(cuò)誤 - 500 Internal Server Error //服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤(服務(wù)器程序錯(cuò)誤)
- 503 Server Unavailable //服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求(服務(wù)器性能達(dá)到瓶頸時(shí),拒絕后續(xù)服務(wù))
Restful架構(gòu)與其他架構(gòu)的區(qū)別(了解)
SOAP WebService
WebService 跨編程語言和跨操作系統(tǒng)平臺(tái)的遠(yuǎn)程調(diào)用技術(shù)。
略...
如何設(shè)計(jì)Restful API(Restful設(shè)計(jì)要素)
- 資源路徑(URI):設(shè)計(jì)資源路徑;
- HTTP動(dòng)詞:即請(qǐng)求方式;
- 過濾信息:獲取資源列表時(shí)的分頁操作,或普通的查詢操作都要用到過濾信息,此時(shí)要合理分配過濾信息,避免過濾信息過多,違反Restful規(guī)定;
- 狀態(tài)碼:服務(wù)端在客戶端發(fā)送請(qǐng)求后,其應(yīng)返回的響應(yīng)狀態(tài)碼;
- 錯(cuò)誤處理:服務(wù)端在發(fā)現(xiàn)客戶端傳入的參數(shù)錯(cuò)誤時(shí),應(yīng)該返回的信息;
- 返回結(jié)果:POST操作后,需要返回資源實(shí)例;GET資源列表時(shí),需要返回資源數(shù)組。
資源路徑
在Restful架構(gòu)中,每個(gè)網(wǎng)址代表一種資源,所以網(wǎng)址中不能有動(dòng)詞,只能有名詞。一般來說API中的名詞應(yīng)該是復(fù)數(shù)。
API的版本號(hào)問題:
- 處理方式1:將API的版本號(hào)加入到資源的地址中。
- 處理方式2:將API的版本號(hào)加入到HTTP請(qǐng)求頭中。
HTTP動(dòng)詞
對(duì)資源的操作(CURD),由HTTP動(dòng)詞(謂詞)表示。
- GET :從服務(wù)器取出資源(一項(xiàng)或多項(xiàng))。
- POST :在服務(wù)器新建一個(gè)資源。
- PUT :在服務(wù)器更新資源(客戶端提供改變后的完整資源)。(返回整個(gè)資源的信息)
- DELETE :從服務(wù)器刪除資源。
- PATCH :在服務(wù)器更新資源(客戶端提供改變的屬性)。(只返回更新的屬性)
過濾信息
如果記錄數(shù)很多,服務(wù)器不可能將它們都返回給用戶。
篩選操作前,API應(yīng)該提供參數(shù),過濾返回的結(jié)果。
狀態(tài)碼
服務(wù)器向用戶返回的狀態(tài)碼和提示信息,使用標(biāo)準(zhǔn)HTTP狀態(tài)碼。
200 OK 服務(wù)器成功返回用戶請(qǐng)求的資源,該操作是冪等的。
204 NO CONTENT 刪除數(shù)據(jù)成功(無響應(yīng)體)。
400 Bad Request 用戶發(fā)出的請(qǐng)求有錯(cuò)誤,該操作是冪等的。
401 Unauthorized 表示用戶沒有認(rèn)證,無法進(jìn)行當(dāng)前操作(用戶未提供認(rèn)證選項(xiàng)或參數(shù))。
403 Forbidden 表示用戶訪問是被禁止的。(用戶提供了認(rèn)證參數(shù),但可能認(rèn)證參數(shù)錯(cuò)誤,或無權(quán)限)。
422 Unprocesable Entity 當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),發(fā)生一個(gè)驗(yàn)證錯(cuò)誤(驗(yàn)證信息不全)。
500 Internal Server Error /服務(wù)器發(fā)生錯(cuò)誤,用戶將無法判斷發(fā)出的請(qǐng)求是否成功。
錯(cuò)誤處理
配合HTTP狀態(tài)碼。如果狀態(tài)碼是4XXX 或 5XXX,就應(yīng)該向用戶返回出錯(cuò)信息,信息如下。一般來說,返回的信息中將error作為鍵名,出錯(cuò)信息作為鍵值即可。
{
"error":"參數(shù)錯(cuò)誤"
}
返回結(jié)果
針對(duì)不同操作,服務(wù)器向用戶返回的結(jié)果應(yīng)該符合以下規(guī)范:
- GET/collections:返回資源對(duì)象的列表(數(shù)組)
- GET/collections/identity:返回單個(gè)資源對(duì)象
如果資源不存在,返回404狀態(tài)碼; - POST/collections:返回新生成的資源對(duì)象(返回新創(chuàng)建的資源的全部屬性)
- PUT/collections/identity:返回完整的資源對(duì)象(返回被更新資源的完整屬性)
- PATCH/collections/identity:返回被修改的屬性
- DELETE/collections/identity:返回一個(gè)空文檔
刪除了資源,要返回204狀態(tài)碼。
identity 是指讀取資源時(shí)傳入的標(biāo)識(shí)符
[常見的state code](http://www.cnblogs.com/shanyou/archive/2012/05/06/2486134.html)