【計算機網絡】HTTP 的 Methods

GET 與 POST

GET 是指完整請求一個資源,POST 是指提交表單。

GET 直觀上是把參數包含在 url 內,請求獲取一個 html 頁面、圖片、css、js 等資源,瀏覽器可能會將 GET 請求的 url 地址加入緩存,以便下次訪問。

POST 通過 request body 傳遞參數,提交一個 form 表單, 並得到一個顯示提交結果的網頁。

從表面上看,兩者的區別在於:

  • GET 使用 url 或者 cookie 傳參,而 POST 將數據放在 request body 中。
  • GET 方式提交的數據有長度限制,而 POST 的數據可以非常大。
  • POST 比 GET 安全,因爲 GET 的數據在瀏覽器地址欄可見。

以上幾個方面並不是他們的本質區別,但至少是表面使用上的區別。兩者實際上是相同的,之所以會出現以上的區別,主要原因還是在於一些歷史原因和約定俗成的用法。

  • 首先,在 http 協議中,並沒有規定 Method 爲 GET 時數據參數一定要放在 url 而不能存在 body 且把數據存在 body 中;也沒有要求 Method 爲 POST 時數據一定要放在 body 中。實際上現代的 Web Server 已經不僅僅支持瀏覽器使用,他們還都能支持 GET 中包含 body 這樣的請求,這些請求通常不由瀏覽器發出。
  • 其次,http 協議對 GET 和 POST 並沒有數據長度的限制。實際上 url 並不存在參數長度上限的說法,反而是一些特定的瀏覽器對整個 url 的長度會有限制,有些瀏覽器則取決於操作系統的支持。因爲 url 過長的話,服務器處理起來會產生負擔,影響服務器的併發響應,有些服務器攻擊就是通過告訴服務器 Content-Length 很大,使之長時間響應,從而導致訪問超時。
  • 最後,安全性的差異主要在於如果通過 GET 提交數據,像用戶名和密碼將明文顯示在 url 裏,由於登錄頁面有可能被瀏覽器緩存,這樣當別人查看瀏覽器的歷史記錄時,就可以得到這組用戶名和密碼了。但這依然不是 GET 和 POST 的本質區別。

兩者的根本區別是:

  • GET 請求是冪等性的,而 POST 不是。(冪等性:一次和多次請求某一個資源應該具有同樣的副作用。對於 GET 而言,意味着對同一個 url 的多個請求應該返回同樣的結果。)
  • GET 產生一個 tcp 數據包,POST 產生兩個 tcp 數據包。

正是由於 GET 請求是冪等的,在網絡不好的隧道中會嘗試重試,因此如果使用 GET 來實現增刪改這些功能,則會有重複操作的風險,容易導致副作用嗎,而瀏覽器和操作系統並不能夠識別出這些操作來。

對於 GET 請求,瀏覽器會把 http header 和 data 一併發送出去,服務器相應狀態碼 200(返回數據);對於 POST, 瀏覽器會先發送 header,服務器相應狀態碼 100(continue)瀏覽器再發送 data,服務器相應狀態碼 200(返回數據)。在網絡環境良好的情況下,發一次包和發兩次包的的時間差別基本可以忽略,而在網絡環境差的情況下,兩次包的 tcp 在驗證數據包完整性上,有非常大的優點。但並不是所有的瀏覽器再 POST 中都會發送兩個包,Firefox 就只發送一次。

總的來說,GET 和 POST 的區別是:

GET POST
使用 url 或者 cookie 傳參 將數據放在 request body 中
提交的數據長度有限制 可以處理非常大的數據
參數明文顯示在瀏覽器地址欄中(不夠安全)
冪等性 非冪等性
產生一個 tcp 數據包 產生兩個 tcp 數據包

其他方法

GET:獲取被請求 url 指定的信息實體。

HEAD:獲取請求實體的元信息而不需要傳輸實體主體,因此跟 GET 方法基本一致,元信息也一致。常用於測試超文本鏈接的有效性、可訪問性、和最近的改變。

POST:向服務器提交一個帶有實體的請求,其實際功能通常由服務器決定。

PUT:請求服務器把請求中的實體存儲在請求 url 的標識下,如果該實體在服務器已經存在,則新請求的實體將被當做所指定實體的修改版本。

DELETE:請求服務器刪除請求 url 指定的資源。

TRACE:激發一個遠程的、應用層的請求消息迴路,該請求中不能包含實體。

CONNECT:用於動態切換到隧道的代理服務器。

OPTIONS:指定資源的通信選項信息。

方法的安全性

  • 執行動作
    • GET 和 HEAD 方法僅僅獲取資源而不執行動作,所以往往被考慮是“安全”的;而可以被用戶代理的其他方法,如 POST、PUT、DELETE,則可能會執行不安全的動作。
  • 冪等性(Idempotence)
    • GET、HEAD、PUT、DELETE 執行多次請求的結果與執行一次的結果相同;OPTIONS 和 TRACE 具有內在的冪等性
  • 客戶端與服務器端的安全性
    • GET、HEAD、OPTIONS 只是從服務器獲取資源而不對服務器做任何修改,所以對於服務器端是安全的,但在客戶端不安全;
    • POST 影響服務器端的資源。
    • 綜上,TRACE 只是記錄路徑信息,不會引起不安全行爲。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章