[toc]
Http 基礎(chǔ)
Http的原理和工作機制
Http 定義 Http到底是什么
直觀印象:
- 瀏覽器輸入地址,打開網(wǎng)頁
- Android發(fā)送請求秦驯,返回對應(yīng)的內(nèi)容
HyperText Transfer Protocol 超文本傳輸協(xié)議
-
超文本:在電腦顯示的犁罩,含有可以指向其他文本的文本
其實就是Html庄拇,http最初就是為了傳輸Html文檔而誕生的呈础。
HyperText 毡惜,所謂的超其實是可擴展的意思瓤狐。
HTTP 的工作方式
瀏覽器 :
用戶輸入地址后回?或點擊鏈接 -> 瀏覽器拼裝 HTTP 報文并發(fā)送請求給服務(wù)器 -> 服 務(wù)器處理請求后發(fā)送響應(yīng)報文給瀏覽器 -> 瀏覽器解析響應(yīng)報文并使用渲染引擎顯示 到界面
手機 App :
用戶點擊或界面自動觸發(fā)聯(lián)網(wǎng)需求 -> Android 代碼調(diào)用拼裝 HTTP 報文并發(fā)送請求 到服務(wù)器 -> 服務(wù)器處理請求后發(fā)送響應(yīng)報文給手機 -> Android 代碼處理響應(yīng)報文并 作出相應(yīng)處理(如儲存數(shù)據(jù)瞬铸、加工數(shù)據(jù)、顯示數(shù)據(jù)到界面)
URL -> HTTP報文
URL 格式
三部分:協(xié)議類型础锐、服務(wù)器地址(和端口號)嗓节、路徑(Path) 協(xié)議類型://服務(wù)器地址[:端口號]/路徑
http://hencoder.com/users?gender=male
在瀏覽器輸入Url會被轉(zhuǎn)化成請求報文。
請求報文 Request
Host不是給服務(wù)器看的皆警,是給主機的拦宣,所以不屬于請求行。
Http 有信姓,0.9 1.1 2.0版本恢着,0.9已經(jīng)廢棄,1.1正被大量使用财破,正在向2.0遷移
Body掰派,提供給服務(wù)器看的具體內(nèi)容(一般般業(yè)務(wù)相關(guān)),不是必須的左痢。
Body是提供給服務(wù)器靡羡,讓服務(wù)器去處理的內(nèi)容系洛,而用來定位請求的都在Head中。
響應(yīng)報文
和請求報文(Request)基本一樣略步,
除了第一行描扯,叫狀態(tài)行。返回了一個狀態(tài)碼和狀態(tài)信息趟薄,是這次請求的簡單描述绽诚。
Http的請求方法和狀態(tài)碼
請求方法
重復(fù)執(zhí)行多次結(jié)果還是一樣,就是有冪等性
Get
- 獲取資源杭煎,沒有Body,具有冪等性
- 是第一個版本(0.9)就存在的方法恩够,在瀏覽器輸入地址調(diào)用的就是Get方法,它不對服務(wù)器的數(shù)據(jù)進行操作羡铲。
Body是操作服務(wù)器數(shù)據(jù)用的蜂桶,里面的的內(nèi)容是給服務(wù)器讀的,作為只獲取數(shù)據(jù)不操作數(shù)據(jù)的Get請求自然不需要Body也切,
如果想傳遞參數(shù)扑媚,就要拼在Requst 請求行等path上 比如 /user/1 傳遞參數(shù)1
Get /users/1 Http/1.1
Host api.github.com
在Get 增加Body標簽,Retrofit甚至會報錯雷恃。
Post
- 增加和修改資源疆股,有且一定有Body,不具有冪等性
既然要新增/修改資源倒槐,不增加參數(shù)(Body)服務(wù)器自然無法修改
Put
- 修改(只修改)旬痹,有Body,具有冪等性
既然Post的和Put的區(qū)別
相似 | 區(qū)別 |
---|---|
都可以修改數(shù)據(jù)都符合標準 | Post不具有冪等性导犹,執(zhí)行多次返回不同的結(jié)果唱凯,因為它可以增加資源。Put具有冪等性谎痢,執(zhí)行多次返回相同的結(jié)果磕昼,例如多次修改性別為女,結(jié)果用戶的性別還是女节猿。 |
Delete
- 刪除資源票从,沒有Body,有冪等性(刪除用戶1滨嘱,重復(fù)執(zhí)行無反應(yīng)峰鄙,因為已經(jīng)刪除了,從結(jié)果來看是一樣的)
Delete /users/1 Http/1.1
Host api.github.com
從path就足以定位用戶刪除了太雨,無需Body
Head
和Get請求完全相同吟榴,返回響應(yīng)沒有Body,其他請求方法的響應(yīng)都是有Body的囊扳》苑可以快速得到資源信息兜看。
狀態(tài)碼 (日常中最重要的2打頭 成功,4打頭客戶端錯誤狭瞎。)
作用: 對結(jié)果作出類型化的描述(如獲得成功细移,內(nèi)容未找到)
-
1xx:臨時性消息。如:
-
100 (繼續(xù)發(fā)送)熊锭,如果你發(fā)送的文件太大弧轧,想分段發(fā)送。
Header傳
Excpet: 100-continue
碗殷,服務(wù)器響應(yīng)
HTTP/1.1 100
代表允許你繼續(xù)發(fā)送精绎。發(fā)送成功后返回
HTTP/1.1 200
或者201 101(正在切換協(xié)議 比如http1.1和http2.0的請求不兼容,
-
一般會加一個
Upgrade: h2c
的header試著請求亿扁,詢問服務(wù)器是否支持Http2.0
捺典,服務(wù)器響應(yīng)
HTTP/1.1 101
鸟廓,則代表服務(wù)器支持http2.0服務(wù)器響應(yīng)
HTTP/1.1 200
从祝,代表不識別Http2.0的請求)
-
2xx:成功。最典型的是 200(OK)引谜、201(創(chuàng)建成功)牍陌。
3xx:重定向。如 301(永久移動)员咽、302(暫時移動)毒涧、304(內(nèi)容未改變)。 對于瀏覽器來說表現(xiàn)一樣贝室,
但是301可以通知搜索引擎契讲,你的網(wǎng)站已遷移,搜索引擎會將權(quán)重轉(zhuǎn)移到新域名滑频。
4xx:客戶端錯誤捡偏。如 400(客戶端請求錯誤)、401(認證失敗)峡迷、403(被禁 止)银伟、404(找不到內(nèi)容)。
5xx:服務(wù)器錯誤绘搞。如 500(服務(wù)器內(nèi)部錯誤)
日常中最重要的2打頭 成功彤避,4打頭客戶端錯誤。
HTTP的Header和Body
Body是報文的核心夯辖,但是所有的Body都是配合Header使用的琉预,提交用戶信息有多個方法,都是由Header定義的蒿褂。
- Header是Http消息的元數(shù)據(jù)(metadata) 即數(shù)據(jù)的數(shù)據(jù)