Web開發者,你知道POST與GET的區別及RESTful嗎?

在網站開發的時候通常會對POST和GET產生混淆,讓人混淆的主要原因是基本上POST能解決的問題GET都能解決,反之亦然。今天就來說說者兩者的區別。

GET:字面理解就是獲取資源

  • GET請求標準上是冪等的(用戶應該認為請求是安全的-資源不會被修改,這裡所以說應該是服務器端並不保證資源不會被修改)
  • GET請求可以被瀏覽器緩存;響應也可以被緩存(根據緩存頭信息來處理)
  • GET請求可以保存在瀏覽器歷史記錄中,也可以作為鏈接分發或分享,可以收藏為書籤
  • GET請求的數據都在URL中,可以方便都從瀏覽器中獲取數據(因此不能攜帶諸如密碼的明文數據)
  • GET請求的長度會有限制(比如IE的路徑總長度需小於2048個字符)
  • GET請求的數據只能包含ASCII字符

POST:字面理解就是發佈新資源

  • POST請求標準上不是冪等的(用戶應該認為請求是有副作用的-可能會導致資源修改)
  • POST請求URL可以被瀏覽器緩存,但是POST數據不會被緩存;響應可以被緩存(根據緩存頭信息來處理)
  • POST請求不便於分發或分享,因為POST數據會丟失,不能收藏為書籤。
  • POST請求沒有長度限制,可以用來處理“請求數據”很大的場景(只要不超過服務器端的處理能力)
  • POST請求的數據不限於ASCII字符,可以包含二進制數據

上面兩者區別的解釋中冪等可能不太好理解,冪等(idempotent、idempotence)其實是一個數學或計算機學概念,常見於抽象代數中。冪等具體表現為:

  • 對於單目運算,如果一個運算對於在範圍內的所有的一個數多次進行該運算所得的結果和進行一次該運算所得的結果是一樣的,那麼我們就稱該運算是冪等的。比如絕對值運算就是一個例子,在實數集中,有abs(a)=abs(abs(a))。
  • 對於雙目運算,則要求當參與運算的兩個值是等值的情況下,如果滿足運算結果與參與運算的兩個值相等,則稱該運算冪等,如求兩個數的最大值的函數,即max(x,x) = x。

通俗的講冪等的意味著對同一URL的多個請求應該返回同樣的結果。但其實也不不是非常的嚴格,比如新聞站點的頭版不斷更新。雖然第二次請求會返回不同的一批新聞,該操作仍然被認為是和冪等的,因為它總是返回當前的新聞。從根本上說,如果目標是當用戶打開一個鏈接時,他可以確信從自身的角度來看沒有改變資源即可。

事實上Http定義了與服務器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的查,改,增,刪4個操作。也就是說GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息。所以GET在信息修改層面,GET比POST安全。GET 請求一般不應產生副作用。它僅僅是獲取資源信息,就像數據庫查詢一樣,不會修改,增加數據,不會影響資源的狀態。

在說過了GET、POST實際用法後,我們發現很多人都沒有按照HTTP規範(http://www.ietf.org/rfc/rfc2616.txt)去做。導致這個問題的原因有很多,比如說:

  1. 很多人貪方便,更新資源時用了GET,因為用POST必須要到FORM(表單),這樣會麻煩一點。
  2. 對資源的增,刪,改,查操作,其實都可以通過GET/POST完成,不需要用到PUT和DELETE。
  3. 早期的Web MVC框架設計者們並沒有有意識地將URL當作抽象的資源來看待和設計,所以導致一個比較嚴重的問題是傳統的Web MVC框架基本上都只支持GET和POST兩種HTTP方法,而不支持PUT和DELETE方法。

以上3點都是沒有嚴格遵守HTTP規範,隨著架構的發展,出現了REST(Representational State Transfer),一套支持HTTP規範的RESTful架構。

REST這個詞,是Roy Thomas Fielding在他2000年的博士論文中提出的。REST即Representational State Transfer的縮寫。直接翻譯是”表現層狀態轉化”。具體請查看:http://zh.wikipedia.org/wiki/REST


分享到:


相關文章: