本文主要對GET與POST基本區別進行彙總並掌握,如有錯誤與遺漏之處,請指出。 文章出處:http://www.cnblogs.com/useryangtao/ 1. HTTP HTTP(即超文本傳輸協議)是現代網路中最常見和常用的協議之一,設計它的目的是保證客戶機和伺服器之間的通信。 HTTP 的 ...
本文主要對GET與POST基本區別進行彙總並掌握,如有錯誤與遺漏之處,請指出。
文章出處:http://www.cnblogs.com/useryangtao/
1. HTTP
HTTP(即超文本傳輸協議)是現代網路中最常見和常用的協議之一,設計它的目的是保證客戶機和伺服器之間的通信。
HTTP 的工作方式是客戶端與伺服器之間的 "請求-響應" 協議。
客戶端可以是 Web 瀏覽器,伺服器端可以是電腦上的某些網路應用程式。
通常情況下,由瀏覽器向伺服器發起 HTTP 請求,伺服器向瀏覽器返迴響應。
響應包含了請求的狀態信息以及可能被請求的內容。
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) 中。
4. 緩存,書簽,歷史記錄,預設method
緩存 : GET會被緩存,POST不能。
書簽 : GET可收藏為書簽,POST不可收藏為書簽
歷史記錄 : GET請求的URL,參數會被瀏覽器保留在歷史中,POST參數不會。
預設method : 在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請求返回內容。
作者: 楊濤
出處: http://www.cnblogs.com/useryangtao
此博客文章僅供交流學習,如原創文章,轉載請註明出處。