天天看點

HTTP請求頭和響應頭詳解【轉】

最近老猿在開始學習爬蟲相關的知識,由于老猿以前隻做非web的背景應用,發現相關知識太過匮乏,導緻學習很困難,為此不得不從一些基礎知識惡補開始,對于這些知識,老猿會将網上找到的比較認可的内容直接轉發。

http由兩部分組成:請求和響應。當你在web浏覽器中輸入一個url時,浏覽器将根據你的要求建立并發送請求,該請求包含所輸入的url以及一些與浏覽器本身相關的資訊。當伺服器收到這個請求時将傳回一個響應,該響應包括與該請求相關的資訊以及位于指定url(如果有的話)的資料。直到浏覽器解析該響應并顯示出網頁(或其他資源)為止。

http請求

http請求的格式如下所示:

在http請求中,第一行必須是一個請求行(request line),用來說明請求類型、要通路的資源以及使用的http版本。緊接着是一個首部(header)小節,用來說明伺服器要使用的附加資訊。在首部之後是一個空行,再此之後可以添加任意的其他資料[稱之為主體(body)]。

在http中,定義了多種請求類型,通常我們關心的隻有get請求和post請求。隻要在web浏覽器上輸入一個url,浏覽器就将基于該url向伺服器發送一個get請求,以告訴伺服器擷取并傳回什麼資源。對于www.baidu.com的get請求如下所示:

請求行的第一部分說明了該請求是get請求。該行的第二部分是一個斜杠(/),用來說明請求的是該域名的根目錄。該行的最後一部分說明使用的是http 1.1版本(另一個可選項是1.0)。那麼請求發到哪裡去呢?這就是第二行的内容。

第2行是請求的第一個首部,host。首部host将指出請求的目的地。結合host和上一行中的斜杠(/),​​可以通知伺服器請求的是www.baidu.com/(http​​ 1.1才需要使用首部host,而原來的1.0版本則不需要使用)。第三行中包含的是首部user-agent,伺服器端和用戶端腳本都能夠通路它,它是浏覽器類型檢測邏輯的重要基礎。該資訊由你使用的浏覽器來定義(在本例中是firefox 1.0.1),并且在每個請求中将自動發送。最後一行是首部connection,通常将浏覽器操作設定為keep-alive(當然也可以設定為其他值)。注意,在最後一個首部之後有一個空行。即使不存在請求主體,這個空行也是必需的。

要發送get請求的參數,則必須将這些額外的資訊附在url本身的後面。其格式類似于:

url ? name1=value1&name2=value2&…&namen=valuen

該資訊稱之為查詢字元串(query string),它将會複制在http請求的請求行中,如下所示:

注意,為了将文本“professional ajax”作為url的參數,需要編碼處理其内容,将空格替換成%20,這稱為url編碼(url encoding),常用于http的許多地方(javascript提供了内建的函數來處理url編碼和解碼)。“名稱—值”(name—value)對用 & 隔開。絕大部分的伺服器端技術能夠自動對請求主體進行解碼,并為這些值的通路提供一些邏輯方式。當然,如何使用這些資料還是由伺服器決定的。

另一方面,post請求在請求主體中為伺服器提供了一些附加的資訊。通常,當填寫一個線上表單并送出它時,這些填入的資料将以post請求的方式發送給伺服器。

以下就是一個典型的post請求:

從上面可以發現, post請求和get請求之間有一些差別。首先,請求行開始處的get改為了post,以表示不同的請求類型。你會發現首部host和user-agent仍然存在,在後面有兩個新行。其中首部content-type說明了請求主體的内容是如何編碼的。浏覽器始終以application/ x-www-form- urlencoded的格式編碼來傳送資料,這是針對簡單url編碼的mime類型。首部content-length說明了請求主體的位元組數。在首部connection後是一個空行,再後面就是請求主體。與大多數浏覽器的post請求一樣,這是以簡單的“名稱—值”對的形式給出的,其中name是professional ajax,publisher是wiley。你可以以同樣的格式來組織url的查詢字元串參數。

下面是一些最常見的請求頭:

http響應

如下所示,http響應的格式與請求的格式十分類似:

正如你所見,在響應中唯一真正的差別在于第一行中用狀态資訊代替了請求資訊。狀态行(status line)通過提供一個狀态碼來說明所請求的資源情況。以下就是一個http響應的例子:

在本例中,狀态行給出的http狀态代碼是200,以及消息ok。狀态行始終包含的是狀态碼和相應的簡短消息,以避免混亂。最常用的狀态碼有:

◆200 (ok): 找到了該資源,并且一切正常。

◆304 (not modified): 該資源在上次請求之後沒有任何修改。這通常用于浏覽器的緩存機制。

◆401 (unauthorized): 用戶端無權通路該資源。這通常會使得浏覽器要求使用者輸入使用者名和密碼,以登入到伺服器。

◆403 (forbidden): 用戶端未能獲得授權。這通常是在401之後輸入了不正确的使用者名或密碼。

◆404 (not found): 在指定的位置不存在所申請的資源。

在狀态行之後是一些首部。通常,伺服器會傳回一個名為data的首部,用來說明響應生成的日期和時間(伺服器通常還會傳回一些關于其自身的資訊,盡管并非是必需的)。接下來的兩個首部大家應該熟悉,就是與post請求中一樣的content-type和content-length。在本例中,首部content-type指定了mime類型html(text/html),其編碼類型是iso-8859-1(這是針對美國英語資源的編碼标準)。響應主體所包含的就是所請求資源的html源檔案(盡管還可能包含純文字或其他資源類型的二進制資料)。浏覽器将把這些資料顯示給使用者。

注意,這裡并沒有指明針對該響應的請求類型,不過這對于伺服器并不重要。用戶端知道每種類型的請求将傳回什麼類型的資料,并決定如何使用這些資料。

繼續閱讀