你真的弄懂 HTTP 了嗎?(三)

這是我參與8月更文挑戰的第9天,活動詳情查看:8月更文挑戰html

相關文章:

1、說一下 GET 和 POST 的區別?

1.1 是什麼

GETPOST,二者是HTTP協議中發送請求的方法web

GET

GET方法請求一個指定資源的表示形式,使用GET的請求應該只被用於獲取數據api

POST

POST方法用於將實體提交到指定的資源,一般致使在服務器上的狀態變化或反作用數組

本質上都是TCP連接,並沒有差異瀏覽器

可是因爲HTTP的規定和瀏覽器/服務器的限制,致使他們在應用過程當中會體現出一些區別緩存

1.2 區別

w3schools獲得的標準答案的區別以下:安全

  • GET在瀏覽器回退時是無害的,而POST會再次提交請求。
  • GET產生的URL地址能夠被Bookmark,而POST不能夠。
  • GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。
  • GET請求只能進行url編碼,而POST支持多種編碼方式。
  • GET請求參數會被完整保留在瀏覽器歷史記錄裏,而POST中的參數不會被保留。
  • GET請求在URL中傳送的參數是有長度限制的,而POST沒有。
  • 對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。
  • GET比POST更不安全,由於參數直接暴露在URL上,因此不能用來傳遞敏感信息。
  • GET參數經過URL傳遞,POST放在Request body中

參數位置

貌似從上面看到GETPOST請求區別很是大,但二者實質並無區別服務器

不管 GET 仍是 POST,用的都是同一個傳輸層協議,因此在傳輸上沒有區別markdown

當不攜帶參數的時候,二者最大的區別爲第一行方法名不一樣cookie

POST /uri HTTP/1.1 \r\n

GET /uri HTTP/1.1 \r\n

當攜帶參數的時候,咱們都知道GET請求是放在url中,POST則放在body

GET 方法簡約版報文是這樣的

GET /index.html?name=qiming.c&age=22 HTTP/1.1
Host: localhost
複製代碼

POST 方法簡約版報文是這樣的

POST /index.html HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded

name=qiming.c&age=22
複製代碼

注意:這裏只是約定,並不屬於HTTP規範,相反的,咱們能夠在POST請求中url中寫入參數,或者GET請求中的body攜帶參數

參數長度

HTTP 協議沒有Body和 URL 的長度限制,對 URL 限制的大可能是瀏覽器和服務器的緣由

IEURL長度的限制是2083字節(2K+35)。對於其餘瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操做系統的支持

這裏限制的是整個URL長度,而不只僅是參數值的長度

服務器處理長 URL 要消耗比較多的資源,爲了性能和安全考慮,會給 URL 長度加限制

安全

POST  GET 安全,由於數據在地址欄上不可見

然而,從傳輸的角度來講,他們都是不安全的,由於 HTTP 在網絡上是明文傳輸的,只要在網絡節點上捉包,就能完整地獲取數據報文

只有使用HTTPS才能加密安全

數據包

對於GET方式的請求,瀏覽器會把http headerdata一併發送出去,服務器響應200(返回數據)

對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok

並非全部瀏覽器都會在POST中發送兩次包,Firefox就只發送一次

2、說說 HTTP 常見的請求頭有哪些? 做用?

2.1 是什麼

HTTP頭字段(HTTP header fields),是指在超文本傳輸協議(HTTP)的請求和響應消息中的消息頭部分

它們定義了一個超文本傳輸協議事務中的操做參數

HTTP頭部字段能夠本身根據須要定義,所以可能在 Web 服務器和瀏覽器上發現非標準的頭字段

下面是一個HTTP請求的請求頭:

GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Cache-Control: max-age=0
複製代碼

2.2 分類

常見的請求字段以下表所示:

字段名 說明 示例
Accept 可以接受的迴應內容類型(Content-Types) Accept: text/plain
Accept-Charset 可以接受的字符集 Accept-Charset: utf-8
Accept-Encoding 可以接受的編碼方式列表 Accept-Encoding: gzip, deflate
Accept-Language 可以接受的迴應內容的天然語言列表 Accept-Language: en-US
Authorization 用於超文本傳輸協議的認證的認證信息 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cache-Control 用來指定在此次的請求/響應鏈中的全部緩存機制 都必須 遵照的指令 Cache-Control: no-cache
Connection 該瀏覽器想要優先使用的鏈接類型 Connection: keep-alive Connection: Upgrade
Cookie 服務器經過 Set- Cookie (下文詳述)發送的一個 超文本傳輸協議Cookie Cookie: $Version=1; Skin=new;
Content-Length 以 八位字節數組 (8位的字節)表示的請求體的長度 Content-Length: 348
Content-Type 請求體的 多媒體類型 Content-Type: application/x-www-form-urlencoded
Date 發送該消息的日期和時間 Date: Tue, 15 Nov 1994 08:12:31 GMT
Expect 代表客戶端要求服務器作出特定的行爲 Expect: 100-continue
Host 服務器的域名(用於虛擬主機 ),以及服務器所監聽的傳輸控制協議端口號 Host: en.wikipedia.org:80 Host: en.wikipedia.org
If-Match 僅當客戶端提供的實體與服務器上對應的實體相匹配時,才進行對應的操做。主要做用時,用做像 PUT 這樣的方法中,僅當從用戶上次更新某個資源以來,該資源未被修改的狀況下,才更新該資源 If-Match: "737060cd8c284d8af7ad3082f209582d"
If-Modified-Since 容許在對應的內容未被修改的狀況下返回304未修改 If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
If-None-Match 容許在對應的內容未被修改的狀況下返回304未修改 If-None-Match: "737060cd8c284d8af7ad3082f209582d"
If-Range 若是該實體未被修改過,則向我發送我所缺乏的那一個或多個部分;不然,發送整個新的實體 If-Range: "737060cd8c284d8af7ad3082f209582d"
Range 僅請求某個實體的一部分 Range: bytes=500-999
User-Agent 瀏覽器的瀏覽器身份標識字符串 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0
Origin 發起一個針對 跨來源資源共享 的請求 Origin: www.example-social-network.com

2.3 使用場景

經過配合請求頭和響應頭,能夠知足一些場景的功能實現:

協商緩存

協商緩存是利用的是【Last-Modified,If-Modified-Since】【ETag、If-None-Match】這兩對請求頭響應頭來管理的

Last-Modified 表示本地文件最後修改日期,瀏覽器會在request header加上If-Modified-Since(上次返回的Last-Modified的值),詢問服務器在該日期後資源是否有更新,有更新的話就會將新的資源發送回來

Etag就像一個指紋,資源變化都會致使ETag變化,跟最後修改時間沒有關係,ETag能夠保證每個資源是惟一的

If-None-Match的header會將上次返回的Etag發送給服務器,詢問該資源的Etag是否有更新,有變更就會發送新的資源回來

而強制緩存不須要發送請求到服務端,根據請求頭expirescache-control判斷是否命中強緩存

強制緩存與協商緩存的流程圖以下所示:

會話狀態

cookie,類型爲「小型文本文件」,指某些網站爲了辨別用戶身份而儲存在用戶本地終端上的數據,經過響應頭set-cookie決定

做爲一段通常不超過 4KB 的小型文本數據,它由一個名稱(Name)、一個值(Value)和其它幾個用於控制 Cookie 有效期、安全性、使用範圍的可選屬性組成

Cookie 主要用於如下三個方面:

  • 會話狀態管理(如用戶登陸狀態、購物車、遊戲分數或其它須要記錄的信息)
  • 個性化設置(如用戶自定義設置、主題等)
  • 瀏覽器行爲跟蹤(如跟蹤分析用戶行爲等
相關文章
相關標籤/搜索