GET,POST — 簡述

本文主要對GET與POST基本區別進行彙總並掌握,若有錯誤與遺漏之處,請指出。html

1. HTTP

HTTP(即超文本傳輸協議)是現代網絡中最多見和經常使用的協議之一,
設計它的目的是保證客戶機和服務器之間的通訊。
HTTP 的工做方式是客戶端與服務器之間的 「請求-響應」 協議。
客戶端能夠是 Web 瀏覽器,服務器端能夠是計算機上的某些網絡應用程序。
一般狀況下,由瀏覽器向服務器發起 HTTP 請求,服務器向瀏覽器返回響應。
響應包含了請求的狀態信息以及可能被請求的內容。segmentfault

2.請求方式

HTTP方法有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT瀏覽器

其中兩種常見的 HTTP 請求就是:GET 和 POST。
區別: _GET_是從服務器上獲取數據,_POST_則是向指定的資源提交要被處理的數據緩存

3.格式

請求報文的格式:
  < request line >
  < headers >
  < blank line >
  < request-body >安全

GET請求數據按照查詢字符串(名稱/值對)方式,放置在HTTP請求協議頭(headers)中,也就是URL以後;服務器

而POST提交的數據則放在實體的主體(request-body)中。restful

4. 緩存,書籤,歷史記錄,默認method

  _4.1 緩存:_ GET會被緩存,POST不能。網絡

  _4.2 書籤:_ GET可收藏爲書籤,POST不可收藏爲書籤併發

  _4.3 歷史記錄:_ GET請求的URL,參數會被瀏覽器保留在歷史中,POST參數不會。大數據

  _4.4 默認請求:_ 在from提交的時候,若是不指定Method,則默認爲get請求。

5. 響應速度

GET請求是能夠被客戶端緩存的。會比POST高效。

AJAX環境中GET響應快速,POST須要先發送HTTP頭部(headers) 再發送報文實體的主體(request-body)中的數據。

6. 類型限制

6.1 GET限制數據集的值必須爲ASCII字符;

GET提交的數據將會附加在url以後,以?分開與url分開。

1.以 ? 來分隔URL和數據;
2.以& 來分隔參數;
3.若是數據是英文或數字,原樣發送;
4.若是數據是中文或其它字符,則進行BASE64編碼
5.GET將數據的按照variable=value的形式,添加到URL後面;
如:http:// www.abc.com/?username=yt&id=123

6.2 POST沒有限制,容許二進制數據。

POST是將數據放在請求的數據體(request-body)中,按照查詢字符串(名稱/值對)相對應的方式,傳遞到所指向URL;

7. 大小限制

7.1.GET方式提交的數據最多隻能是1024字節,POST支持較大數據傳輸

7.2HTTP協議對GET和POST都沒有對長度的限制

RFC 2616 中明確對 uri 的長度並無限制。
不過雖然在RFC中並無對uri的長度進行限制,可是各大瀏覽器廠家實現上限制了URL的長度。

IE對URL長度的限制是2083字節(2K+35)
而對於URL長度上的限制,有兩方面的緣由形成 ( 安全考慮 ):
瀏覽器:聽說早期的瀏覽器會對URL長度作限制。IE對URL長度會限制在2083個字符內,Chrome會崩潰。
 服務器:URL長了,對服務器處理也是一種負擔。
 本來一個會話就沒有多少數據,如今若是有人惡意地構造幾個幾M大小的URL,
 並不停地訪問你的服務器。服務器的最大併發數顯然會降低。
 另外一種攻擊方式是:把告訴服務器Content-Length是一個很大的數,
 而後只給服務器發一點兒數據,嘿嘿,服務器你就傻等着去吧。
 哪怕你有超時設置,這種故意的次次訪問超時也能讓服務器吃不了兜着走。
 有鑑於此,多數服務器出於安全啦、穩定啦方面的考慮,會給URL長度加限制。
 可是這個限制是針對全部HTTP請求的,與GET、POST沒有關係。

8. 實際中 — POST比GET「相對安全」

GET所發送的數據是 URL 的一部分,
有時候會直接反應在瀏覽器的地址欄,
如今的瀏覽器大多會記住曾經輸入過的URL(在發送密碼或敏感信息時毫不要使用 GET !)。
試想若是你曾經在別人電腦上填過一個很私密的表單,那麼你的這份記錄極可能被連沒什麼電腦常識的人都一覽無遺。

可是被抓包以後的POST請求和GET請求是同樣裸露的,因此這裏是相對的。

9. 語義上 — GET比POST「相對安全」

說 POST 比 GET 安全 也不徹底對的。
根據HTTP規範,POST表示可能修改變服務器上的資源的請求。
在語義上(restful視角):
GET的是獲取指定URL上的資源,是讀操做。
重要的一點是不論對某個資源GET多少次,它的狀態是不會改變的,
在這個意義上,咱們說GET是安全的(不是被密碼學或者數據保護意義上的安全)。
由於GET是安全的,因此GET返回的內容能夠被瀏覽器,Cache服務器緩存起來。

POST的語義是修改變服務器上的資源的請求,因此是不安全的,
每次提交的POST,代碼都會認爲這個操做會修改資源的狀態,
因而,瀏覽器在你按下F5的時候會跳出確認框,緩存服務器不會緩存POST請求返回內容。

參考:
GET請求和POST請求的區別
再也不以訛傳訛,GET和POST的真正區別
淺談HTTP中Get與Post的區別
HTTP請求Get和Post的區別總結

相關文章
相關標籤/搜索