Http基礎 這篇文章是講 網路請求的先導文章,主要講 工作流程,請求報文和響應報文的格式,以及 和`POST`方法的具體含義。 Http工作流程 是一個客戶端和伺服器端請求和應答的標準( )。客戶端是終端用戶,伺服器端是網站。通過使用 瀏覽器、網路爬蟲或者其它的工具,客戶端發起一個到伺服器上指定端 ...
Http基礎
這篇文章是講Android
網路請求的先導文章,主要講Http
工作流程,請求報文和響應報文的格式,以及GET
和POST
方法的具體含義。
Http工作流程
HTTP
是一個客戶端和伺服器端請求和應答的標準(TCP
)。客戶端是終端用戶,伺服器端是網站。通過使用Web
瀏覽器、網路爬蟲或者其它的工具,客戶端發起一個到伺服器上指定埠(預設埠為80)的HTTP
請求。(我們稱這個客戶端)叫用戶代理(user agent
)。應答的伺服器上存儲著(一些)資源,比如HTML文件和圖像。(我們稱)這個應答伺服器為源伺服器(origin server
)。在用戶代理和源伺服器中間可能存在多個中間層,比如代理,網關,或者隧道(tunnels
)。儘管TCP/IP協議是互聯網上最流行的應用,HTTP
協議並沒有規定必須使用它和(基於)它支持的層。 事實上,HTTP
可以在任何其他互聯網協議上,或者在其他網路上實現。HTTP
只假定(其下層協議提供)可靠的傳輸,任何能夠提供這種保證的協議都可以被其使用。
這裡我們規定下文討論的HTTP
都是基於tcp協議的,至於為什麼不是udp,原因在於(打開)一個網頁必須傳送很多數據,而TCP協議提供傳輸控制,按順序組織數據,和錯誤糾正。
我們用一個例子來說明http在通信的時候IP
, TCP
, DNS
分別做了什麼工作。
客戶端發起請求,想要瀏覽百度這個網頁,他先告訴DNS,獲取百度這個網頁的IP地址,然後HTTP協議生成針對目標web伺服器的HTTP請求報文,TCP協議則為了方便通信,將HTTP請求報文分割成報文段,把每個報文可靠地傳給對方。IP協議則搜索對方的地址,一邊中轉一邊傳送
伺服器端,TCP協議負責從對方那裡接收到報文段,重組到達的報文段,HTTP則負責對WEB伺服器請求的內容進行處理。然後結果同樣利用TCP/IP向用戶回傳。
我們仔細看一下上面的流程,去掉TCP,IP ,DNS在裡面做的工作,首先客戶端發起請求,向伺服器請求一個頁面的內容,通常是在瀏覽器裡面輸入一個網址(URL
)這個網址叫URL
(統一資源定位符),他只是表示資源所在的地點,在網路中更常見的是URI
(統一資源標識符),他是URL
的超集,在後面我們討論的資源路徑都是用URI
表示的,我們可以看一個絕對URI
的例子。
http://user:[email protected]:80/dir/index.htm?uid=1#ch1
http:協議方案名
user:pass 登錄信息 (登錄伺服器的身份認證,可省略)
www.example.cn 伺服器地址(可以是DNS可解析的名稱,也可以時IP)
80 伺服器埠號 (可選,不填則預設是80)
dir/index.htm 帶層次的文件路徑 (指定伺服器上的文件路徑來定位特指的資源)
uid=1 查詢字元串 (針對已制定的文件路徑內的資源,使用查詢字元串傳入任意參數)
#ch1 片段標識符 (無明確用法,不予討論 ,可忽略)
那麼在瀏覽器或者其他工具中輸入URI
後是怎麼應用的呢?答案是HTTP
請求報文(後面會講),HTTP
根據輸入的URI
和其他參數生成HTTP
請求報文發送給伺服器,忽略中間傳輸過程,HTTP
伺服器得到請求報文後,會對其進行解析,然後根據請求內容查詢伺服器的資源,再以響應報文的形式傳回給客戶端。客戶端解析響應報文的內容,根據報文的內容進行下一步的任務。
請求報文與響應報文的格式
用於HTTP
協議交互的信息被稱為HTTP
報文。請求端的HTTP
報文叫做請求報文,響應段(伺服器端)的叫做響應報文。HTTP
報文本身是由多行數據構成的字元串文本。用(CR+LF做換行符,CR回車符,16進位0x0d,LF換行符,16進位0x0a)
下圖就是請求報文的格式
上圖可以看到請求報文是由報文首部,空行,報文實體構成的。報文首部在通信中至關重要,因為重要作用的信息幾乎都在這邊。報文主體是所需要的用戶和資源信息在這邊。
下麵我們重點說一下首部欄位。使用首部欄位是為了給瀏覽器和伺服器提供報文主體大小,所使用的語言,認證信息等內容。HTTP首部欄位是由首部欄位名和欄位值構成的,中間用冒號":"分割。在請求報文中首部欄位根據實際用處被分為以下3種格式
- 通用首部欄位
- 請求首部欄位
- 實體首部欄位
其中實體首部欄位是針對報文的實體部分使用的首部,補充了資源內容更新時間等與實體有關的信息。
下麵的表格顯示了常用首部欄位的類型有哪些
通用首部欄位
| 首部欄位名 | 說明 |
| :-------- |:--------|
| Cache-Control|控制緩存的行為 |
|Date|創建報文的日期時間|
|Connection|逐跳首部、連接的管理|
|Transfer-Encoding|指定報文主體的傳輸編碼方式|
請求首部欄位
|首部欄位名| 說明|
|:--------|:--------|
|Accept|用戶代理可處理的媒體類型|
|Accept-Charset|優先的字元集|
|Accept-Encoding|優先的內容編碼|
|Accept-Language|優先的語言(自然語言)|
|Authorization|Web認證信息|
|Host|請求資源所在伺服器|
|User-Agent|HTTP 客戶端程式的信息|
實體首部欄位
|首部欄位名|說明|
|:---- |:----- |
|Allow|資源可支持的HTTP方法|
|Content-Encoding|實體主體適用的編碼方式|
|Content-Type|實體主體的媒體類型|
|Content-Length|實體主體的大小(單位:位元組)|
|Content-Location|替代對應資源的URI|
關於每個欄位的含義可以參考一下《圖解http協議》這本書。
下麵我們看一下響應報文的格式
由上圖可以看出來,響應報文格式和請求報文大同小異,都是有保溫首部,空行,報文實體組成。不同的是,組成報文首段的是通用首部,響應首部和實體首部組成。狀態行的不同和響應首部的增加是響應報文有別於請求報文的地方,我們重點看一下狀態行。
狀態行中需要HTTP的版本,狀態碼和短語
下麵的表格顯示了狀態碼和短語
狀態碼 | 類別 | 原因短語 |
---|---|---|
1xx | Informational(信息性狀態碼) | 接收的請求正在處理 |
2xx | Success(成功狀態碼) | 請求正常處理完畢 |
3xx | Redirection(重定向狀態碼) | 需要進行附加操作以完成請求 |
4xx | Client Error(客戶端錯誤狀態碼) | 伺服器無法處理請求 |
5xx | Server Error(伺服器錯誤狀態碼) | 伺服器處理請求出錯 |
狀態碼種類繁多,我們介紹實際上常用的幾種
200 OK 表示從客戶端發來的請求在伺服器端被正常處理了。
204 No Content 該狀態碼代表伺服器接收的請求已成功處理,但在返回的響應報文中不含實體的主體部分。
206 Partial Content 該狀態碼表示客戶端進行了範圍請求,而伺服器成功執行了這部分的 GET 請求。響應報文中包含由 Content-Range 指定範圍的實體內容。
301 Moved Permanently 永久性重定向。該狀態碼表示請求的資源已被分配了新的 URI,以後應使用資源現在所指的 URI
302 Found 臨時性重定向。該狀態碼表示請求的資源已被分配了新的 URI,希望用戶(本次)能使用新的 URI 訪問。
303 See Other 該狀態碼表示由於請求對應的資源存在著另一個 URI,應使用 GET 方法定向獲取請求的資源。
304 Not Modified 該狀態碼表示客戶端發送附帶條件的請求時,伺服器端允許請求訪問資源,但未滿足條件的情況。
400 Bad Request 該狀態碼表示請求報文中存在語法錯誤
401 Unauthorized 該狀態碼表示發送的請求需要有通過 HTTP 認證(BASIC 認證、DIGEST 認證)的認證信息。另外若之前已進行過 1 次請求,則表示用 戶認證失敗。
403 Forbidden 該狀態碼表明對請求資源的訪問被伺服器拒絕了。
404 Not Found 該狀態碼表明伺服器上無法找到請求的資源。除此之外,也可以在伺服器端拒絕請求且不想說明理由時使用。
500 Internal Server Error 該狀態碼表明伺服器端在執行請求時發生了錯誤。
503 Service Unavailable 該狀態碼表明伺服器暫時處於超負載或正在進行停機維護,現在無法處理請求。
接下來,我們看一下響應首部欄位的幾個欄位的含義。
首部欄位名 | 說明 |
---|---|
Accept-Ranges | 是否接受位元組範圍請求 |
Retry-After | 對再次發起請求的時機要求 |
ETag | 資源的匹配信息 |
上面就是我們對請求報文和響應報文的簡單介紹
GET和POST
這篇文章主要是Android網路請求的先導文章,所以這裡我們主要介紹Android網路請求的時候2個主要的方法,GET
和POST
網上有很多說法關於GET和POST的區別,大家可以看看這篇文章GET和POST真正的區別,這個不是我們這篇文章要討論的內容,我們只需要記住一點,GET是從伺服器獲取數據,POST是改變伺服器數據就可以了。
GET
方法用於獲取由URI所標示的資源信息,他是將請求參數直接放到URL後面,第一個參數前有一個"?",參數格式為 參數名=參數值,參數之間通過"&"鏈接
POST
用於修改伺服器的數據,所以他的參數一般存儲在報文的報文主體。