說說http請求

爲何作web前端要了解http標準?由於瀏覽器要從服務端獲取網頁,網頁也可能將信息再提交給服務器,這其中都有http的鏈接。web系統既然和http連接有瓜葛,你就必須去了解它。我將從一下幾個方面講解一下http標準:html

  1. http請求的過程
  2. http狀態碼的意義
  3. http頭部信息
  4. cookie狀態管理
  5. 方法Get POST

 

http請求的過程

一、鏈接前端

當咱們輸入一個請求時,首先要創建一個socket鏈接,由於socket是經過ip和端口創建的,因此以前還有一個DNS解析過程,把域名變成ip,若是url裏不包含端口號,則會使用該協議的默認端口號。web

DNS的過程是這樣的:首先咱們知道咱們本地的機器上在配置網絡時都會填寫DNS,這樣本機就會把這個url發給這個配置的DNS服務器,若是可以找到相應的url則返回其ip,不然該DNS將繼續將該解析請求發送給上級DNS,整個DNS能夠看作是一個樹狀結構,該請求將一直髮送到根直到獲得結果。如今已經擁有了目標ip和端口號,這樣咱們就能夠打開socket鏈接了。(具體可參考:從輸入URL到頁面加載完成都發生了什麼?)shell

 

二、請求瀏覽器

鏈接成功後,web瀏覽器開始向web服務器發送請求,這些請求通常是GET或者POST請求。POST請求表單(form)參數傳遞GET命令的格式爲:路徑/文件名    緩存

 

三、應答安全

Web服務器接收到這個請求以後開始處理。服務器從它的文檔空間空搜索子目錄的文件。若是找到該文件,則把該文件內容傳輸給web瀏覽器。同時,爲了告知瀏覽器,web服務器會傳輸一些HTTP頭信息,HTTP頭信息和信息體之間會有一行空行隔開,經常使用的HTTP頭信息有:服務器

  • HTTP 1.0 200 OK這是web服務器應答的第一行,列出正在運行的HTTP的版本號和應答代碼。代碼200表明請求完成。(具體代碼請參考常見的iis日誌代碼
  • MIME_Version:1.0 它指示MIME類型的版本
  • content_type:類型 這個頭信息很是重要,它指示HTTP體信息的MIME類型。如:content_type:text/html 指示傳送的數據是HTML文檔。
  • content_length:長度值 它指示HTTP體信息的長度(字節)。

 

四、關閉鏈接cookie

當應答結束後,Web瀏覽器與Web服務器必須斷開,以保證其它Web瀏覽器可以與Web服務器創建鏈接。網絡

 

http狀態碼的意義

1xx:信息,請求收到,繼續處理
2xx:成功,行爲被成功地接受、理解和採納
3xx:重定向,爲了完成請求,必須進一步執行的動做
4xx:客戶端錯誤,請求包含語法錯誤或者請求沒法實現
5xx:服務器錯誤,服務器不能實現一種明顯無效的請求

100系列碼

從100到199範圍的HTTP狀態碼是信息報告碼。基於各類緣由考慮,大多數狀況下咱們是 不多看見這些代碼的。首先,若是一個瀏覽器嘗試訪問一個網站,而網站返回這些代碼時,它們每每都不會顯示在屏幕上。它們只是瀏覽器使引用的內部碼。另外, 這些代碼不常見的另一個緣由是起初HTTP標準不容許使用這一範圍的狀態碼。就其自己而言,它們也一直沒有被普遍地使用。

200系列碼

從200到299範圍的狀態碼是操做成功代碼。一樣的,在正常的Web上網中,你也極可能不 曾在屏幕上看到這些代碼。相反的,這些代碼是在瀏覽器內部使用的,用以確認操做成功確認和當前請求狀態。雖然這些代碼一般不顯示,可是有一些故障排除工具 可以讀到它們,就像和其它大多數的HTTP狀態碼同樣,它們在錯誤診斷過程當中是很是有用的。

300系列碼

從300到399範圍的狀態碼是重定向代碼。本質上,它們告訴Web瀏覽器必須執行其它一些 操做以完成請求。基於這個命令的特色,它能夠自動地執行,或者要求額外的用戶輸入。好比,狀態碼301表示一個特定資源已經被永久地先移除,所以未來全部 訪問該資源請求都應該定向到一個特定的URL上。

400系列碼

在400範圍的狀態碼是客戶端錯誤碼。這種類型的錯誤碼每每跟安全相關。好比,若是一個客戶 端嘗試訪問一個未受權訪問的資源,服務器就會返回一個狀態碼401。相似地,若是客戶端嘗試訪問一個禁止的資源,在這種狀況下客戶端的認證狀態是同樣的, 那麼服務器可能會返回一個狀態碼403,表示禁止對該資源進行訪問。

若是請求不正確或客戶端超時,400級錯誤碼也可能被返回。然而,有一個400級的代碼老是 具備誤導性:404。雖然這個代碼在技術上被歸類爲客戶端錯誤,可是事實上它能夠同時表示客戶端或服務器上的錯誤。但這個錯誤碼只是簡單地顯示爲沒有找到 請求的資源。當這個錯誤發生在客戶端時,它每每表示的是網絡鏈接問題。在其餘時候,這個錯誤的發生還多是因爲資源已從服務器上轉移或重命名而形成的。

500系列碼

500級狀態碼錶示的是服務器錯誤。好比,若是Web服務器超時,它就會產生一個504錯 誤。雖然,一個500級的錯誤每每表示的不是服務器的問題,而是在服務器上運行的Web應用的問題。好比,我本身的我的網站是用ASP編寫的,它負責動態 生成HTML網頁。在調試的過程當中,有Bug的代碼總會致使個人Web服務器返回HTTP狀態碼500,該代碼是通常表示內部服務器錯誤。這個代碼只是出 現問題了,而且HTTP沒法解決該問題。

具體代碼請參考常見的iis日誌代碼

 

http頭部信息

咱們任意打開一個網站如www.shell.com

 

能夠看到Request Header(請求頭)裏的內容

其中包含:Accept、Accept-Charset、Accept-Encoding、Accept-language、Authorization、If-Match、If-None-Match、If-Modified-Since、If-Unmodified-Since、If-Range、Range、Proxy-Authenticate、Proxy-Authorization、Host、Referer、User-Agent

1、Accept

告訴WEB服務器本身接受什麼介質類型,*/* 表示任何類型,type/* 表示該類型下的全部子類型,type/sub-type。

2、Accept-Charset

瀏覽器告訴服務器本身能接收的字符集。

3、Accept-Encoding

瀏覽器申明本身接收的編碼方法,一般指定壓縮方法,是否支持壓縮,支持什麼壓縮方法(gzip,deflate)。

4、Accept-Language

瀏覽器申明本身接收的語言。語言跟字符集的區別:中文是語言,中文有多種字符集,好比big5,gb2312,gbk等等。

5、Authorization

當客戶端接收到來自WEB服務器的 WWW-Authenticate 響應時,用該頭部來回應本身的身份驗證信息給WEB服務器。

6、If-Match

若是對象的 ETag 沒有改變,其實也就意味著對象沒有改變,才執行請求的動做,獲取文檔。

7、If-None-Match

若是對象的 ETag 改變了,其實也就意味著對象也改變了,才執行請求的動做,獲取文檔。

8、If-Modified-Since

若是請求的對象在該頭部指定的時間以後修改了,才執行請求的動做(好比返回對象),不然返回代碼304,告訴瀏覽器該對象沒有修改。例如:If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT

9、If-Unmodified-Since

若是請求的對象在該頭部指定的時間以後沒修改過,才執行請求的動做(好比返回對象)。

10、If-Range

瀏覽器告訴 WEB 服務器,若是我請求的對象沒有改變,就把我缺乏的部分給我,若是對象改變了,就把整個對象給我。瀏覽器經過發送請求對象的ETag 或者本身所知道的最後修改時間給 WEB 服務器,讓其判斷對象是否改變了。老是跟 Range 頭部一塊兒使用。

12、Range

瀏覽器(好比 Flashget 多線程下載時)告訴 WEB 服務器本身想取對象的哪部分。例如:Range: bytes=1173546

13、Proxy-Authenticate

代理服務器響應瀏覽器,要求其提供代理身份驗證信息。

14、Proxy-Authorization

瀏覽器響應代理服務器的身份驗證請求,提供本身的身份信息。

15、Host

客戶端指定本身想訪問的WEB服務器的域名/IP 地址和端口號。如Host:rss.sina.com.cn

16、Referer

瀏覽器向WEB 服務器代表本身是從哪一個網頁URL得到點擊當前請求中的網址/URL,例如:Referer:http://www.ecdoer.com/

17、User-Agent

瀏覽器代表本身的身份(是哪一種瀏覽器)。例如:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36

 

cookie狀態管理

 

 

定義:客戶端(瀏覽器)向服務器發出一個請求,服務器會將一小段字符串以set-cookie消息頭的方式發回給客戶端,瀏覽器會存儲這一小段信息,當客戶端再次向服務器發出請求時,在某些條件下,瀏覽器會自動發送存儲的這一小段文本信息給到服務器端。某些條件是指:檢測時間是否已通過期,檢測路徑是否符合規則。

一、什麼是cookie?

       瀏覽器在訪問服務器時,服務器將一些數據以set-cookie消息頭的形式發送給瀏覽器。瀏覽器會將這些數據保存起來。當瀏覽器再次訪問服務器時,會將這些數據以cookie消息頭的形式 發送給服務器。經過這種方式,能夠管理用戶的狀態。

二、如何建立cookie

       固然是服務器端建立,Response.SetCookie

三、獲取cookie

       固然是瀏覽器獲取,Request.GetCookie

四、cookie的保存時間

       能夠設置cookie的過時時間,若是不設置cookie的過時時間,那麼此cookie的過時時間就是瀏覽器回話期間,若是瀏覽器關閉,cookie就會失效。

五、如何清除cookie

       把當前cookie的過時時間設置成過時時間就行了。

 

 

方法Get POST

在客戶機和服務器之間進行請求-響應時,兩種最常被用到的方法是:GET 和 POST。

GET - 從指定的資源請求數據。

POST - 向指定的資源提交要被處理的數據

 

有關 GET 請求的其餘一些註釋:

GET 請求可被緩存

GET 請求保留在瀏覽器歷史記錄中

GET 請求可被收藏爲書籤

GET 請求不該在處理敏感數據時使用

GET 請求有長度限制

GET 請求只應當用於取回數據

 

 

POST 方法

請注意,查詢字符串(名稱/值對)是在 POST 請求的 HTTP 消息主體中發送的:

POST /test/demo_form.asp HTTP/1.1

Host: w3schools.com

name1=value1&name2=value2

有關 POST 請求的其餘一些註釋:

POST 請求不會被緩存

POST 請求不會保留在瀏覽器歷史記錄中

POST 不能被收藏爲書籤

POST 請求對數據長度沒有要求

 

下面的表格比較了兩種 HTTP 方法:GET 和 POST。

 

GET

POST

後退按鈕/刷新

無害

數據會被從新提交(瀏覽器應該告知用戶數據會被從新提交)。

書籤

可收藏爲書籤

不可收藏爲書籤

緩存

能被緩存

不能緩存

編碼類型

application/x-www-form-urlencoded

application/x-www-form-urlencoded 或 multipart/form-data。爲二進制數據使用多重編碼。

歷史

參數保留在瀏覽器歷史中。

參數不會保存在瀏覽器歷史中。

對數據長度的限制

是的。當發送數據時,GET 方法向 URL 添加數據;URL 的長度是受限制的(URL 的最大長度是 2048 個字符)。

無限制。

對數據類型的限制

只容許 ASCII 字符。

沒有限制。也容許二進制數據。

安全性

與 POST 相比,GET 的安全性較差,由於所發送的數據是 URL 的一部分。

在發送密碼或其餘敏感信息時毫不要使用 GET !

POST 比 GET 更安全,由於參數不會被保存在瀏覽器歷史或 web 服務器日誌中。

可見性

數據在 URL 中對全部人都是可見的。

數據不會顯示在 URL 中。

相關文章
相關標籤/搜索