1. http請求和響應步驟
在講解OkHttp之前, 我們首先來個高清大圖, 看下http請求的整個步驟, 有個整體概念.
2. http每一步詳細內容
在一次完整的HTTP通訊過程中, Web瀏覽器與Web伺服器之間將完成下列7個步驟:
2.1 建立TCP連線
在HTTP工作開始之前, Web瀏覽器首先要通過網路與Web伺服器建立連線, 該連線是通過TCP來完成的, 該協議與IP協議共同構建Internet, 即著名的TCP/IP協議族, 因此Internet又被稱作是TCP/IP網路.
HTTP是比TCP更高層次的應用層協議, 根據規則, 只有低層協議建立之後才能進行更高層協議的連線, 因此, 首先要建立TCP連線, 一般TCP連線的埠號是80.
TCP連線中我們比較熟悉的就是三次握手, 但是為什麼是三次而不是兩次或四次呢? 這裡我想到了一個比喻來讓大家明白.
1 2 3 4 |
敵人封鎖江面, 我方間諜和聯絡員只能通過電報機隔著江面交流. 但是那時的電報機質量不穩定, 有可能會出現失靈的情況. 所以就出現瞭如下對話: 間諜: 聯絡員, 你能收到我發的話麼? 你要是能收到, 就說明我這個電報機可以發電報. 聯絡員: 間諜, 我收到你發的話了, 這說明我的電報機可以收. 但是我不確定我的電報機能不能發, 你能收到我發的這句話麼? 你要是能收到, 就說明我的電報機是可以發電報的. 間諜: 聯絡員, 我收到你的話了. 我的電報機也是能發能收, 我們可以正式交流情報了. |
希望通過這個故事讓大家明白為什麼會有tcp三次握手.
2.2 Web瀏覽器向Web伺服器傳送請求命令
一旦建立了TCP連線, Web瀏覽器就會向Web伺服器傳送請求命令
例如:GET/sample/hello.jsp HTTP/1.1
2.3 Web瀏覽器傳送請求頭資訊
瀏覽器傳送其請求命令之後, 還要以頭資訊的形式向Web伺服器傳送一些別的資訊, 這些資訊用來描述瀏覽器自己. 之後瀏覽器傳送了一空白行來通知伺服器, 表示它已經結束了該頭資訊的傳送. 若是post請求, 還會在傳送完請求頭資訊之後傳送請求體.
2.4 Web伺服器應答
客戶機向伺服器發出請求後, 伺服器會向客戶機回送應答.
HTTP/1.1 200 OK
應答的第一部分是協議的版本號和應答狀態碼
2.5 Web伺服器傳送應答頭資訊
正如客戶端會隨同請求傳送關於自身的資訊一樣,伺服器也會隨同應答向使用者傳送關於它自己的資料及被請求的文件. 最後以一個空白行來表示頭資訊傳送到此結束.
2.6 Web伺服器向瀏覽器傳送資料
Web伺服器向瀏覽器傳送頭資訊後, 它就以Content-Type
應答頭資訊所描述的格式傳送使用者所請求的實際資料
2.7 Web伺服器關閉TCP連線
一般情況下, 一旦Web伺服器向瀏覽器傳送了請求資料, 它就要關閉TCP連線. 如果瀏覽器或者伺服器在其頭資訊加入了這行程式碼
Connection:keep-alive
TCP連線在傳送後將仍然保持開啟狀態. 於是, 瀏覽器可以繼續通過相同的連線傳送請求. 保持連線節省了為每個請求建立新連線所需的時間, 還節約了網路頻寬.
3. 使用fiddler抓包驗證請求資訊和響應資訊
這裡, 給大家推薦一個抓包工具fiddler
, 免費好用. 而且可以在本機設定代理, 直接抓取同區域網的Android或iOS手機的資料包, 如果需要請谷歌fiddler android
.
這裡我們安裝fiddler
後, 開啟composer
, composer
可以直接構建http請求並執行.
3.1 get的請求和應答
我們首先構建一個get
請求, 設定如下:
可以看到, 我們需要設定請求方法
, 請求地址
, 請求協議
和請求頭
.
點選execute
, 即可執行我們的請求. 上圖左欄即是我們請求的結果, 點選檢視. 下圖就是我們http請求的raw資料, raw
代表沒有為了方便觀看而格式化的資料.
接下來看下我們請求的應答:
3.2 post的請求和應答
post請求, 因為涉及到需要上傳的請求體, 手頭沒有現成的伺服器, 所以我們用ithome
的登陸來舉例說明. 下圖是登陸時post的具體資料:
我們分析下, 其請求方法為post
, 請求地址為btnLogin_Click
, 請求協議為HTTP/1.1
. 然後是請求頭, 請求頭中有一個比較重要的設定是Content-Type: application/json; charset=utf-8
. 表示我們會上傳一個json檔案, json檔案的格式是utf-8, 這裡面儲存的就是使用者名稱和密碼, 通過post請求在請求體中傳輸給伺服器.
json檔案具體內容是:
這正驗證了我們上文所說.
我們看下post請求的響應:
我們又看到了Content-Type: application/json; charset=gb2312
, 這說明在響應頭結束後, 會有一個gb2312編碼的json. 我們看下這個json的內容:
看到我們的請求返回的內容就是ok
, 代表有這個使用者名稱和密碼正確.
4. 結語
希望通過這一節, 讓大家對http協議有個整體上的認識, 清楚get和post請求和響應的組成.
如果我們要寫一個庫來完成http協議的功能, 那麼我們應該需要控制 請求方法: get/post
, 請求地址: url
, 請求協議: http/1.1
, 請求頭: 描述自身資訊
, 請求體: post時才有
, 有了這些我們才能構建一個http請求. 當響應時, 我們應該需要一些欄位代表 應答協議: http/1.1
, 響應碼: 200
, 應答頭: content-type等描述自身資訊
, 響應體: 如json, html等
, 這樣我們才能完全的表示我們的返回響應.
有了這些概念, 下一節, 我們講解OkHttp將會特別輕鬆愉快. 因為OkHttp完成的就是get或post請求, 所以OkHttp中就有類來代表我們剛才講到的 請求方法
, 請求地址
, 請求協議
等概念, 瞭解了OkHttp中的這些類, 那麼OkHttp你也就學會怎麼使用了.
謝謝下列文章:
http://www.cnblogs.com/yin-jingyu/archive/2011/08/01/2123548.html