HTTP GET 和 POST 的區別

作用

GET 用於獲取資源,而 POST 用於傳輸實體主體。

HTTP GET 和 POST 的區別

參數

GET 和 POST 的請求都能使用額外的參數,但是 GET 的參數是以查詢字符串出現在 URL 中,而 POST 的參數存儲在實體主體中。

GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1POST /test/demo_form.asp HTTP/1.1Host: w3schools.comname1=value1&name2=value2

不能因為 POST 參數存儲在實體主體中就認為它的安全性更高,因為照樣可以通過一些抓包工具(Fiddler)查看。

因為 URL 只支持 ASCII 碼,因此 GET 的參數中如果存在中文等字符就需要先進行編碼,例如中文會轉換為%E4%B8%AD%E6%96%87,而空格會轉換為%20。POST 支持標準字符集。

安全

安全的 HTTP 方法不會改變服務器狀態,也就是說它只是可讀的。

GET 方法是安全的,而 POST 卻不是,因為 POST 的目的是傳送實體主體內容,這個內容可能是用戶上傳的表單數據,上傳成功之後,服務器可能把這個數據存儲到數據庫中,因此狀態也就發生了改變。

安全的方法除了 GET 之外還有:HEAD、OPTIONS。

不安全的方法除了 POST 之外還有 PUT、DELETE。

冪等性

冪等的 HTTP 方法,同樣的請求被執行一次與連續執行多次的效果是一樣的,服務器的狀態也是一樣的。換句話說就是,冪等方法不應該具有副作用(統計用途除外)。在正確實現的條件下,GET,HEAD,PUT 和 DELETE 等方法都是冪等的,而 POST 方法不是。所有的安全方法也都是冪等的。

GET /pageX HTTP/1.1 是冪等的。連續調用多次,客戶端接收到的結果都是一樣的:

GET /pageX HTTP/1.1GET /pageX HTTP/1.1GET /pageX HTTP/1.1GET /pageX HTTP/1.1

POST /add_row HTTP/1.1 不是冪等的。如果調用多次,就會增加多行記錄:

POST /add_row HTTP/1.1 -> Adds a 1nd rowPOST /add_row HTTP/1.1 -> Adds a 2nd rowPOST /add_row HTTP/1.1 -> Adds a 3rd row

DELETE /idX/delete HTTP/1.1 是冪等的,即便不同的請求接收到的狀態碼不一樣:

DELETE /idX/delete HTTP/1.1 -> Returns 200 if idX existsDELETE /idX/delete HTTP/1.1 -> Returns 404 as it just got deletedDELETE /idX/delete HTTP/1.1 -> Returns 404

可緩存

如果要對響應進行緩存,需要滿足以下條件:

  • 請求報文的 HTTP 方法本身是可緩存的,包括 GET 和 HEAD,但是 PUT 和 DELETE 不可緩存,POST 在多數情況下不可緩存的。
  • 響應報文的狀態碼是可緩存的,包括:200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501。
  • 響應報文的 Cache-Control 首部字段沒有指定不進行緩存。

XMLHttpRequest

為了闡述 POST 和 GET 的另一個區別,需要先了解 XMLHttpRequest:

XMLHttpRequest 是一個 API,它為客戶端提供了在客戶端和服務器之間傳輸數據的功能。它提供了一個通過 URL 來獲取數據的簡單方式,並且不會使整個頁面刷新。這使得網頁只更新一部分頁面而不會打擾到用戶。XMLHttpRequest 在 AJAX 中被大量使用。

在使用 XMLHttpRequest 的 POST 方法時,瀏覽器會先發送 Header 再發送 Data。但並不是所有瀏覽器會這麼做,例如火狐就不會。而 GET 方法 Header 和 Data 會一起發送。

更多內容請關注每日編程,每天進步一點。


分享到:


相關文章: