Android網絡編程(五):HTTP協議

一、簡介

HTTP(HyperText Transfer Protocol)即超文本傳輸協議,我們前面TCP/IP協議章節講過,HTTP協議屬於TCP/IP協議族中的一員,TCP/IP協議族橫跨OSI模型中的應用層、傳輸層、網絡層和數據鏈路層,而HTTP協議正是屬於應用層,提供接口給應用軟件使用,HTTP協議是基於TCP協議的。

HTTP是一種無狀態的協議,無狀態是指Web瀏覽器與Web服務器之間不需要建立持久的連接,這意味着當一個客戶端向服務器端發出請求,然後Web服務器返回響應(Response),連接就被關閉了,在服務器端不保留連接的有關信息。也就是說,HTTP請求只能由客戶端發起,而服務器不能主動向客戶端發送數據。

二、特點

  1. HTTP是無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。
  2. HTTP是媒體獨立的:這意味着,只要客戶端和服務器知道如何處理的數據內容,任何類型的數據都可以通過HTTP發送。客戶端以及服務器指定使用適合的MIME-type內容類型。
  3. HTTP是無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

三、HTTP請求

HTTP請求由 請求行(request line)、請求頭部(header)空行請求正文四個部分組成。

Get請求例子,使用Charles抓取的request:

GET /562f25980001b1b106000338.jpg HTTP/1.1
Host    img.mukewang.com
User-Agent    Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept    image/webp,image/*,*/*;q=0.8
Referer    http://www.imooc.com/
Accept-Encoding    gzip, deflate, sdch
Accept-Language    zh-CN,zh;q=0.8

第一部分:請求行,用來說明請求類型,要訪問的資源以及所使用的HTTP版本.
GET說明請求類型爲GET,[/562f25980001b1b106000338.jpg]爲要訪問的資源,該行的最後一部分說明使用的是HTTP1.1版本。

第二部分:請求頭部,緊接着請求行(即第一行)之後的部分,用來說明服務器要使用的附加信息
從第二行起爲請求頭部,HOST將指出請求的目的地.User-Agent,服務器端和客戶端腳本都能訪問它,它是瀏覽器類型檢測邏輯的重要基礎.該信息由你的瀏覽器來定義,並且在每個請求中自動發送等等

第三部分:空行,請求頭部後面的空行是必須的
即使第四部分的請求數據爲空,也必須有空行。

第四部分:請求數據也叫主體,可以添加任意的其他數據。
這個例子的請求數據爲空。

POST請求例子,使用Charles抓取的request:

POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley

第一部分:請求行,第一行明瞭是post請求,以及http1.1版本。
第二部分:請求頭部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:請求數據,第八行。

四、HTTP請求(Requests)

根據HTTP標準,HTTP請求可以使用多種請求方法。
HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

  • GET: 請求指定的頁面信息,並返回實體主體。
  • HEAD: 類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
  • POST: 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
  • PUT: 從客戶端向服務器傳送的數據取代指定的文檔的內容。
  • DELETE: 請求服務器刪除指定的頁面。
  • CONNECT: HTTP/1.1協議中預留給能夠將連接改爲管道方式的代理服務器。
  • OPTIONS: 允許客戶端查看服務器的性能。
  • TRACE: 回顯服務器收到的請求,主要用於測試或診斷。

五、HTTP響應(Response)

一般情況下,服務器接收並處理客戶端發過來的請求後會返回一個HTTP的響應消息。

HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文
在這裏插入圖片描述

六、HTTP狀態碼

狀態代碼有三位數字組成,第一個數字定義了響應的類別,共分五種類別:

1xx:指示信息–表示請求已接收,繼續處理
2xx:成功–表示請求已被成功接收、理解、接受
3xx:重定向–要完成請求必須進行更進一步的操作
4xx:客戶端錯誤–請求有語法錯誤或請求無法實現
5xx:服務器端錯誤–服務器未能實現合法的請求

常見狀態碼:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //服務器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常
更多狀態碼http://www.runoob.com/http/http-status-codes.html

七、工作流程

  1. 客戶端與服務器建立連接:客戶端首先向Web服務器發出建立連接請求,建立TCP連接,打開一個稱爲socket的虛擬文件,此文件的建立標誌着連接建立成功。
  2. 客戶端向服務器提出請求:客戶端發出數據請求包,通過socket向Web服務器提交請求,在此客戶端將請求的對象的統一資源定位符傳給服務器,HTTP的請求一般是GET或POST命令(POST用於FORM參數的傳遞)。GET命令的格式爲:GET路徑/文件名HTTP/1.0。
  3. 服務器接受請求,並根據請求返回相應的文件作爲迴應,每個服務器上都運行着一個偵聽50端口的進程等待來自客戶端HTTP請求。當服務器接收到請求命令後根據命令作出響應,將HTTP頭和酷虎段所請求的URL數據返回給客戶端。
  4. 客戶端與服務器關閉連接:在數據返回完成之後服務器立即發出關閉這個TCP連接的命令,客戶端響應這個命令關閉連接,一次連接完成了。
    在這裏插入圖片描述
    短連接:
    短連接的操作步驟是:建立連接——數據傳輸——關閉連接…建立連接——數據傳輸——關閉連接
    (如果客戶請求頻繁,將在TCP的建立和關閉操作上浪費較多時間和帶寬)

    長連接:
    長鏈接,指在一個連接上可以連續發送多個數據包,在連接保持期間,如果沒有數據包發送,需要雙方發鏈路檢測包。
    長鏈接操作步驟:建立連接——數據傳輸…(保持連接)…數據傳輸——關閉連接
    (長連接可以省去較多的TCP建立和關閉的操作,減少浪費,節約時間)

上一篇:Android網絡編程(四):Socket原理
目錄:Android網絡編程系統性學習目錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章