這是我參與8月更文挑戰的第9天,活動詳情查看:8月更文挑戰html
GET
和POST
,二者是HTTP
協議中發送請求的方法web
GET
方法請求一個指定資源的表示形式,使用GET的請求應該只被用於獲取數據api
POST
方法用於將實體提交到指定的資源,一般致使在服務器上的狀態變化或反作用數組
本質上都是TCP
連接,並沒有差異瀏覽器
可是因爲HTTP
的規定和瀏覽器/服務器的限制,致使他們在應用過程當中會體現出一些區別緩存
從w3schools
獲得的標準答案的區別以下:安全
貌似從上面看到GET
與POST
請求區別很是大,但二者實質並無區別服務器
不管 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
限制的大可能是瀏覽器和服務器的緣由
IE
對URL
長度的限制是2083字節(2K+35)。對於其餘瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操做系統的支持
這裏限制的是整個URL
長度,而不只僅是參數值的長度
服務器處理長 URL
要消耗比較多的資源,爲了性能和安全考慮,會給 URL
長度加限制
POST
比 GET
安全,由於數據在地址欄上不可見
然而,從傳輸的角度來講,他們都是不安全的,由於 HTTP
在網絡上是明文傳輸的,只要在網絡節點上捉包,就能完整地獲取數據報文
只有使用HTTPS
才能加密安全
對於GET
方式的請求,瀏覽器會把http header
和data
一併發送出去,服務器響應200(返回數據)
對於POST
,瀏覽器先發送header
,服務器響應100 continue
,瀏覽器再發送data
,服務器響應200 ok
並非全部瀏覽器都會在POST
中發送兩次包,Firefox
就只發送一次
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
複製代碼
常見的請求字段以下表所示:
字段名 | 說明 | 示例 |
---|---|---|
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 |
經過配合請求頭和響應頭,能夠知足一些場景的功能實現:
協商緩存是利用的是【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
是否有更新,有變更就會發送新的資源回來
而強制緩存不須要發送請求到服務端,根據請求頭expires
和cache-control
判斷是否命中強緩存
強制緩存與協商緩存的流程圖以下所示:
cookie
,類型爲「小型文本文件」,指某些網站爲了辨別用戶身份而儲存在用戶本地終端上的數據,經過響應頭set-cookie
決定
做爲一段通常不超過 4KB 的小型文本數據,它由一個名稱(Name)、一個值(Value)和其它幾個用於控制 Cookie
有效期、安全性、使用範圍的可選屬性組成
Cookie
主要用於如下三個方面: