(一)RESTful架構風格特點
1、統一介面風格
http://伺服器地址:埠號[/專案名稱/版本/資源]
http://
:為我們HTTP協議的訪問頭標準。伺服器地址
:為我們專案伺服器IP地址。埠號
:為我們伺服器內專案訪問的指定編號。[/專案名稱/版本]
:可選 。資源
:網際網路-圖片、音樂、視訊、文字、資料。
2、規範的HTTP請求方法
GET
:從伺服器取出資源(一項或多項)。POST
:在伺服器新建一個資源。(單條或多條)PUT
:在伺服器更新資源。DELETE
:從伺服器刪除資源。
3、HTTP響應碼
序號 | 狀態碼 | 動詞 | 說明 |
---|---|---|---|
1 | 200 | GET | 伺服器成功返回使用者請求的資料 |
2 | 201 | POST | 使用者新增資料成功 |
3 | 201 | PUT | 使用者修改資料成功 |
4 | 204 | DELETE | 使用者刪除資料 |
5 | 400 | POST/PUT | 使用者發出的請求有錯誤,伺服器沒有進行新建或修改資料的操作 |
6 | 404 | GET | 伺服器沒有返回資源. |
4、什麼是無狀態
為什麼說HTTP協議是無狀態的協議呢?
因為它的每個請求都是完全獨立的,每個請求包含了處理這個請求所需的完整的資料,傳送請求不涉及到狀態變更。
而且再次請求也無法判斷他是否之前請求過,如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。
看看下面故事你會有所啟發。
- 無狀態(Stateless)
魔都的老王開了一個會所,一個開會的地方,有大會議室、小會議室、Cosplay情景會議室。
顧客聽說這個會所有特色,於是紛紛前來消費,小明就是其中的一員。
小明上次會議室體驗很棒,儘管有點貴,本週又前來消費。
結賬時,小明以為老王認識自己,和老王套近乎弄個優惠價:"王老闆,我上週剛來過,打個折扣唄"!
老王很茫然地瞅著小明:"上週你來過?我好像一點印象也沒有了嘛,很抱歉,無法優惠"!
小明很不爽地付完錢走人... - 有狀態(Stateful)
老王有一個助手叫小王,看到這一幕於是和老闆有一番對話:
小王:老闆,下次客人來消費,我們們給客人發一張小卡片,來一次打卡一次,凡是打過卡的,都有優惠。來的
次數越多,折扣力度越大,這樣就能有更多的回頭客,您看如何?
老王連說這是好主意,以後就這麼幹!
小明第一次來領了一張考勤卡,打了卡,夾在錢包裡。
第二次來消費埋單時,小明從自己的錢包掏出考勤卡,老王一看原來是回頭客,好說好說,88折優惠,小明和老王都笑的合不攏嘴... - Cookie
後來老王覺得考勤卡上,還應該多記錄一些內容,才能更好地服務客戶,考勤卡上慢慢增加了更多內容。
會員卡片樣例如下:
小明再次來消費時,不僅可以優惠,還可以根據小明的消費習慣,做出最合理的安排。
隨著服務的精細化,小卡片上描述客戶的資訊越來越多,卡片越做越大,由於小卡片受4K位元組的限制,每次客戶前來消費都要攜帶大大的卡片,這很誇張! - Session
小王尋思著,小卡片一直都是客戶攜帶,為何不在公司的電腦上弄個資料庫,記錄客戶的消費習慣,每個客戶有一個資料庫明細。
客戶明細如下:
給小明的小卡片上只要有一個客戶代號"08029snne3e0kekllojeis007"就可以了,查詢電腦就可以知道是小明消費資訊和消費習慣,消費完還可以從賬戶餘額內扣除。
這個客戶代號就是SessionlD,通常儲存在客戶端瀏覽器的Cookie裡。
總結:
上文故事中的"Stateless"、"Stateful"、"Cookie"、"SessionID"以及"Session"與HTTP協議中這些關鍵詞具有相類似的意思。
HTTP最初的設計是無狀態的(stateless),但是無狀態的HTTP無法滿足網際網路日益發展的需求,於是業界擴充套件了HTTP協議,增加了有狀態(stateful)協議頭,使之變成一個有狀態協議。
這個有狀態的協議頭,就是依靠Cookie來實現的,Cookie是維繫客戶端與伺服器之間狀態同步的紐帶。
無論什麼型別的Cookie,都是由伺服器來一手建立,最終解釋權歸伺服器,只有伺服器才理解這些Cookie所代表的真正涵義;客戶只負責攜帶,不需要理解Cookie的真正意義!
(二)JSON資料格式說明
restful風格介面的資料返回格式一般為:JSON資料格式。
1、什麼是JSON
JSON 指的是 JavaScript 物件表示法(Java Script Object Notation)。
JSON 是輕量級的文字資料交換格式。
JSON 具有自我描述性,更易理解。
2、JSON格式的特點
JSON 是純文字,具有"自我描述性"和“層級結構性”。
讀寫的速度更快,消耗流量少。
3、JSON語法
- 格式1
JSON物件:{"鍵1":"值1","鍵2":"值2"}
- 格式2
JSON陣列:[值1,值2,值3.....]
- 格式3
物件+陣列:{"name":"葫蘆娃","age":"8","技能":[" "," "," "]}
- 格式4
陣列+物件:[{"name":"葫蘆娃","age":"8"},{"name":"葫蘆娃","age":"8"}]
參考:https://www.zhihu.com/question/23202402,解釋的很精彩。