1. Restful架構(gòu)與實(shí)戰(zhàn)(筆記)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • API定義規(guī)范 本規(guī)范設(shè)計(jì)基于如下使用場(chǎng)景: 請(qǐng)求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請(qǐng)求頻率非常高,建議使用雙通...
    有涯逐無涯閱讀 2,929評(píng)論 0 6
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 12,427評(píng)論 6 13
  • 一說到REST,我想大家的第一反應(yīng)就是“啊,就是那種前后臺(tái)通信方式。”但是在要求詳細(xì)講述它所提出的各個(gè)約束,以及如...
    時(shí)待吾閱讀 3,601評(píng)論 0 19
  • 人活著,就會(huì)有落寞;前行,就會(huì)有坎坷;動(dòng)心,就會(huì)有情傷。話再漂亮,說不到心上,也是枉然;情意再濃,不懂珍惜,也是徒...
    8900655f254d閱讀 931評(píng)論 0 0

友情鏈接更多精彩內(nèi)容