理解Http請求與響應

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.


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等, 這樣我們才能完全的表示我們的返回響應.

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容