天天看點

HTTP學習筆記總結

HTTP簡介

HTTP協定是Hyper Text Transfer Protocol(超文本傳輸協定)的縮寫,是用于從網際網路(WWW:World Wide Web )伺服器傳輸超文本到本地浏覽器的傳送協定。

HTTP是一個基于TCP/IP通信協定來傳遞資料(HTML 檔案, 圖檔檔案, 查詢結果等)。

HTTP是一個屬于應用層的面向對象的協定,由于其簡捷、快速的方式,适用于分布式超媒體資訊系統。它于1990年提出,經過幾年的使用與發展,得到不斷地完善和擴充。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規範化工作正在進行之中,而且HTTP-NG(Next Generation of HTTP)的建議已經提出。

HTTP協定工作于用戶端-服務端架構為上。浏覽器作為HTTP用戶端通過URL向HTTP服務端即WEB伺服器發送所有請求。Web伺服器根據接收到的請求後,向用戶端發送響應資訊。

主要特點

1、簡單快速:客戶向伺服器請求服務時,隻需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與伺服器聯系的類型不同。由于HTTP協定簡單,使得HTTP伺服器的程式規模小,因而通信速度很快。

2、靈活:HTTP允許傳輸任意類型的資料對象。正在傳輸的類型由Content-Type加以标記。

3.無連接配接:無連接配接的含義是限制每次連接配接隻處理一個請求。伺服器處理完客戶的請求,并收到客戶的應答後,即斷開連接配接。采用這種方式可以節省傳輸時間。

4.無狀态:HTTP協定是無狀态協定。無狀态是指協定對于事務處理沒有記憶能力。缺少狀态意味着如果後續處理需要前面的資訊,則它必須重傳,這樣可能導緻每次連接配接傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。

5、支援B/S及C/S模式

HTTP之URL

HTTP使用統一資源辨別符(Uniform Resource Identifiers, URI)來傳輸資料和建立連接配接。URL是一種特殊類型的URI,包含了用于查找某個資源的足夠的資訊

URL,全稱是UniformResourceLocator, 中文叫統一資源定位符,是網際網路上用來辨別某一處資源的位址。以下面這個URL為例,介紹下普通URL的各部分組成:

http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

從上面的URL可以看出,一個完整的URL包括以下幾部分:

1.協定部分:該URL的協定部分為“http:”,這代表網頁使用的是HTTP協定。在Internet中可以使用多種協定,如HTTP,FTP等等本例中使用的是HTTP協定。在"HTTP"後面的“//”為分隔符

2.域名部分:該URL的域名部分為“www.aspxfans.com”。一個URL中,也可以使用IP位址作為域名使用

3.端口部分:跟在域名後面的是端口,域名和端口之間使用“:”作為分隔符。端口不是一個URL必須的部分,如果省略端口部分,将采用預設端口

4.虛拟目錄部分:從域名後的第一個“/”開始到最後一個“/”為止,是虛拟目錄部分。虛拟目錄也不是一個URL必須的部分。本例中的虛拟目錄是“/news/”

5.檔案名部分:從域名後的最後一個“/”開始到“?”為止,是檔案名部分,如果沒有“?”,則是從域名後的最後一個“/”開始到“#”為止,是檔案部分,如果沒有“?”和“#”,那麼從域名後的最後一個“/”開始到結束,都是檔案名部分。本例中的檔案名是“index.asp”。檔案名部分也不是一個URL必須的部分,如果省略該部分,則使用預設的檔案名

6.錨部分:從“#”開始到最後,都是錨部分。本例中的錨部分是“name”。錨部分也不是一個URL必須的部分

7.參數部分:從“?”開始到“#”為止之間的部分為參數部分,又稱搜尋部分、查詢部分。本例中的參數部分為“boardID=5&ID=24618&page=1”。參數可以允許有多個參數,參數與參數之間用“&”作為分隔符。

(原文:http://blog.csdn.net/ergouge/article/details/8185219 )

URI和URL的差別

URI,是uniform resource identifier,統一資源辨別符,用來唯一的辨別一個資源。

Web上可用的每種資源如HTML文檔、圖像、視訊片段、程式等都是一個來URI來定位的

URI一般由三部組成:

①通路資源的命名機制

②存放資源的主機名

③資源自身的名稱,由路徑表示,着重強調于資源。

URL是uniform resource locator,統一資源定位器,它是一種具體的URI,即URL可以用來辨別一個資源,而且還指明了如何locate這個資源。

URL是Internet上用來描述資訊資源的字元串,主要用在各種WWW客戶程式和伺服器程式上,特别是著名的Mosaic。

采用URL可以用一種統一的格式來描述各種資訊資源,包括檔案、伺服器的位址和目錄等。

URL一般由三部組成:

①協定(或稱為服務方式)

②存有該資源的主機IP位址(有時也包括端口号)

③主機資源的具體位址。如目錄和檔案名等

HTTP之請求消息Request

HTTP學習筆記總結

請求行以一個方法符号開頭,以空格分開,後面跟着請求的URI和協定的版本。

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之響應消息Response

一般情況下,伺服器接收并處理用戶端發過來的請求後會傳回一個HTTP的響應消息。

HTTP響應也由四個部分組成,分别是:狀态行、消息報頭、空行和響應正文

例子
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8

<html>
      <head></head>
      <body>
            <!--body goes here-->
      </body>
</html>
           

第一部分:狀态行,由HTTP協定版本号, 狀态碼, 狀态消息 三部分組成。第一行為狀态行,(HTTP/1.1)表明HTTP版本為1.1版本,狀态碼為200,狀态消息為(ok)

第二部分:消息報頭,用來說明用戶端要使用的一些附加資訊,第二行和第三行為消息報頭,Date:生成響應的日期和時間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8

第三部分:空行,消息報頭後面的空行是必須的

第四部分:響應正文,伺服器傳回給用戶端的文本資訊。空行後面的html部分為響應正文。

HTTP之狀态碼

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

1xx:訓示資訊–表示請求已接收,繼續處理

2xx:成功–表示請求已被成功接收、了解、接受

3xx:重定向–要完成請求必須進行更進一步的操作

4xx:用戶端錯誤–請求有文法錯誤或請求無法實作

5xx:伺服器端錯誤–伺服器未能實作合法的請求

## 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

HTTP請求方法

根據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工作原理

HTTP協定定義Web用戶端如何從Web伺服器請求Web頁面,以及伺服器如何把Web頁面傳送給用戶端。HTTP協定采用了請求/響應模型。用戶端向伺服器發送一個請求封包,請求封包包含請求的方法、URL、協定版本、請求頭部和請求資料。伺服器以一個狀态行作為響應,響應的内容包括協定的版本、成功或者錯誤代碼、伺服器資訊、響應頭部和響應資料。

以下是 HTTP 請求/響應的步驟:

1、用戶端連接配接到Web伺服器

一個HTTP用戶端,通常是浏覽器,與Web伺服器的HTTP端口(預設為80)建立一個TCP套接字連接配接。例如,http://www.oakcms.cn。

2、發送HTTP請求

通過TCP套接字,用戶端向Web伺服器發送一個文本的請求封包,一個請求封包由請求行、請求頭部、空行和請求資料4部分組成。

3、伺服器接受請求并傳回HTTP響應

Web伺服器解析請求,定位請求資源。伺服器将資源複本寫到TCP套接字,由用戶端讀取。一個響應由狀态行、響應頭部、空行和響應資料4部分組成。

4、釋放連接配接TCP連接配接

若connection 模式為close,則伺服器主動關閉TCP連接配接,用戶端被動關閉連接配接,釋放TCP連接配接;若connection 模式為keepalive,則該連接配接會保持一段時間,在該時間内可以繼續接收請求;

5、用戶端浏覽器解析HTML内容

用戶端浏覽器首先解析狀态行,檢視表明請求是否成功的狀态代碼。然後解析每一個響應頭,響應頭告知以下為若幹位元組的HTML文檔和文檔的字元集。用戶端浏覽器讀取響應資料HTML,根據HTML的文法對其進行格式化,并在浏覽器視窗中顯示。

在浏覽器位址欄鍵入URL,按下回車之後會經曆以下流程:

1、浏覽器向 DNS 伺服器請求解析該 URL 中的域名所對應的 IP 位址;

2、解析出 IP 位址後,根據該 IP 位址和預設端口 80,和伺服器建立TCP連接配接;

3、浏覽器發出讀取檔案(URL 中域名後面部分對應的檔案)的HTTP 請求,該請求封包作為 TCP 三次握手的第三個封包的資料發送給伺服器;

4、伺服器對浏覽器請求作出響應,并把對應的 html 文本發送給浏覽器;

5、釋放 TCP連接配接;

6、浏覽器将該 html 文本并顯示内容;

GET和POST請求資訊的差別

GET請求
GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
           

注意最後一行是空行

POST請求
    POST / HTTP/1.1
    Host: www.wrox.com
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
    Gecko/20050225 Firefox/1.0.1
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 40
    Connection: Keep-Alive
    name=Professional%20Ajax&publisher=Wiley
           

1、GET送出

請求的資料會附在URL之後(就是把資料放置在HTTP協定頭中),以?分割URL和傳輸資料,多個參數用&連接配接;例 如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果資料是英文字母/數字,原樣發送,如果是空格,轉換為+,如果是中文/其他字元,則直接把字元串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符号以16進制表示的ASCII。

POST送出

把送出的資料放置在是HTTP包的包體中。上文示例中紅色字型标明的就是實際的傳輸資料

是以,GET送出的資料會在位址欄中顯示出來,而POST送出,位址欄不會改變

2、傳輸資料的大小

首先聲明:HTTP協定沒有對傳輸的資料大小進行限制,HTTP協定規範也沒有對URL長度進行限制。

而在實際開發中存在的限制主要有:

GET:特定浏覽器和伺服器對URL長度有限制,例如 IE對URL長度的限制是2083位元組(2K+35)。對于其他浏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決于操作系 統的支援。

是以對于GET送出時,傳輸資料就會受到URL長度的 限制。

POST:由于不是通過URL傳值,理論上資料不受 限。但實際各個WEB伺服器會規定對post送出資料大小進行限制,Apache、IIS6都有各自的配置。

3、安全性

POST的安全性要比GET的安全性高。比如:通過GET送出資料,使用者名和密碼将明文出現在URL上,因為(1)登入頁面有可能被浏覽器緩存;(2)其他人檢視浏覽器的曆史紀錄,那麼别人就可以拿到你的賬号和密碼了,除此之外,使用GET送出資料還可能會造成Cross-site request forgery攻擊

4、Http get,post,soap協定都是在http上運作的

(1)get:請求參數是作為一個key/value對的序列(查詢字元串)附加到URL上的

查詢字元串的長度受到web浏覽器和web伺服器的限制(如IE最多支援2048個字元),不适合傳輸大型資料集同時,它很不安全

(2)post:請求參數是在http标題的一個不同部分(名為entity body)傳輸的,這一部分用來傳輸表單資訊,是以必須将Content-type設定為:application/x-www-form- urlencoded。post設計用來支援web窗體上的使用者字段,其參數也是作為key/value對傳輸。

但是:它不支援複雜資料類型,因為post沒有定義傳輸資料結構的語義和規則。

(3)soap:是http post的一個專用版本,遵循一種特殊的xml消息格式

Content-type設定為: text/xml 任何資料都可以xml化。

Http協定定義了很多與伺服器互動的方法,最基本的有4種,分别是GET,POST,PUT,DELETE. 一個URL位址用于描述一個網絡上的資源,而HTTP中的GET, POST, PUT, DELETE就對應着對這個資源的查,改,增,删4個操作。 我們最常見的就是GET和POST了。GET一般用于擷取/查詢資源資訊,而POST一般用于更新資源資訊.

我們看看GET和POST的請求差別

GET送出的資料會放在URL之後,以?分割URL和傳輸資料,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把送出的資料放在HTTP包的Body中.

GET送出的資料大小有限制(因為浏覽器對URL的長度有限制),而POST方法送出的資料沒有限制.

GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來擷取變量的值。

GET方式送出資料,會帶來安全問題,比如一個登入頁面,通過GET方式送出資料時,使用者名和密碼将出現在URL上,如果頁面可以被緩存或者其他人可以通路這台機器,就可以從曆史記錄獲得該使用者的賬号和密碼.

HTTP緩存

web緩存發現請求的資源有緩存副本的時候,就會攔截請求,直接讀取緩存内容。緩存可以緩解伺服器壓力,提高web性能,但是要合理使用緩存,并不是所有資源都适合進行緩存。

常見的HTTP緩存隻能存儲GET請求的響應,一般隻有GET請求才會被緩存

緩存分為:私有緩存 和 共享緩存

私有緩存類似于浏覽器的緩存設定,浏覽器緩存前進/後退的導航資源,儲存網頁等

共享緩存是搭建web代理作為本地網絡基礎,儲存常用的網絡資源,減少網絡擁堵

緩存控制

HTTP 1.1 cache-control 請求頭

可以設定請求和響應的緩存控制:

==cache-control:no-store ==

不緩存請求和響應内容

cache-control:no-cache

确認緩存,把請求和緩存資訊發送到伺服器,伺服器驗證緩存是否過期,如果未過期則傳回304,并讀取本地緩存副本

cache-control:publice

一個HTTP請求會經過多個中間人proxy,例如網關,CDN等,如果設定了publice則該請求攜帶的緩存能被中間人緩存

cache-control:private

不能被中間人緩存

cache-control:max-age=9292029398

表明緩存被儲存的有效期,max-age是請求發起後的秒數

Cache-Control: must-revalidate

緩存使用舊資源的時候需要進行驗證

緩存的儲存空間有限,是以緩存會定期清空一些副本,這叫做緩存驅逐

緩存新鮮度:

伺服器更新資源時候,浏覽器不知道,那麼就約定一個過期時間來辨識緩存的新鮮度。一個舊的緩存是不會被直接清除的,當浏覽器發送請求時候,發現有一份舊的緩存,那麼就會在請求上面帶有if-none-match頭,然後伺服器檢查該資源是否過期,如果傳回304則說明副本可以使用,如果傳回新的資源實體則說明已過期。

HTTP Cookie

伺服器發送到浏覽器進行儲存的資料

伺服器通過在響應頭添加set-cookie:<cookie名> = <cookie值>,來把cookie傳遞到用戶端,用戶端接收到資訊後會儲存起來。

會話期cookie

不指定過期時間,每次會話結束自動删除

持久性cookie

設定過期時間expires或者有效期max-age,則為持久性cookie,這些是對應用戶端的時間

JavaScript可以通過document.cookie通路cookie

繼續閱讀