HTTP請求中POST與GET的區別

一、原理區別

一般我們在瀏覽器輸入一個網址訪問網站都是GET請求;再FORM表單中,可以通過設置Method指定提交方式爲GET或者POST提交方式,默認爲GET提交方式。

HTTP定義了與服務器交互的不同方法,其中最基本的四種:GET,POST,PUT,DELETE,HEAD,其中GET和HEAD被稱爲安全方法,因爲使用GET和HEAD的HTTP請求不會產生什麼動作。不會產生動作意味着GET和HEAD的HTTP請求不會在服務器上產生任何結果。但是安全方法並不是什麼動作都不產生,這裏的安全方法僅僅指不會修改信息。

根據HTTP規範,POST可能會修改服務器上的資源的請求。比如CSDN的博客,用戶提交一篇文章或者一個讀者提交評論是通過POST請求來實現的,因爲再提交文章或者評論提交後資源(即某個頁面)不同了,或者說資源被修改了,這些便是“不安全方法”。



二、表現形式區別

搞清楚了兩者的原理區別後,我們來看一下在實際應用中的區別。

首先,我們先看一下HTTP請求的格式:

<method> <request-URL> <version>
<headers>

<entity-body>


在HTTP請求中,奇異行必須是一個請求行,包括請求方法,請求URL,報文所用HTTP版本信息。緊接着是一個herders小節,可以有零個或一個首部,用來說明服務器要使用的附加信息。在首部之後就是一個空行,最後就是報文實體的主體部分,包含一個由任意數據組成的數據塊。但是並不是所有的報文都包含實體的主體部分。

GET請求實例:

GET http://weibo.com/signup/signup.php?inviteCode=2388493434
Host: weibo.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

POST請求實例:

POST /inventory-check.cgi HTTP/1.1
Host: www.joes-hardware.com
Content-Type: text/plain
Content-length: 18

item=bandsaw 2647

接下來看看兩種請求方式的區別:

1、GET請求,請求的數據會附加在URL之後,以?分割URL和傳輸數據,多個參數用&連接。URL的編碼格式採用的是ASCII編碼,而不是uniclde,即是說所有的非ASCII字符都要編碼之後再傳輸。

POST請求:POST請求會把請求的數據放置在HTTP請求包的包體中。上面的item=bandsaw就是實際的傳輸數據。

因此,GET請求的數據會暴露在地址欄中,而POST請求則不會。


2、傳輸數據的大小

在HTTP規範中,沒有對URL的長度和傳輸的數據大小進行限制。但是在實際開發過程中,對於GET,特定的瀏覽器和服務器對URL的長度有限制。因此,在使用GET請求時,傳輸數據會受到URL長度的限制。

對於POST,由於不是URL傳值,理論上是不會受限制的,但是實際上各個服務器會規定對POST提交數據大小進行限制,Apache、IIS都有各自的配置。


3、安全性

POST的安全性比GET的高。這裏的安全是指真正的安全,而不同於上面GET提到的安全方法中的安全,上面提到的安全僅僅是不修改服務器的數據。比如,在進行登錄操作,通過GET請求,用戶名和密碼都會暴露再URL上,因爲登錄頁面有可能被瀏覽器緩存以及其他人查看瀏覽器的歷史記錄的原因,此時的用戶名和密碼就很容易被他人拿到了。除此之外,GET請求提交的數據還可能會造成Cross-site request frogery攻擊


4、HTTP中的GET,POST,SOAP協議都是在HTTP上運行的


三、HTTP響應

HTTP響應報文的格式

<version> <status> <reason-phrase>
<headers>

<entity-body>


status,狀態碼描述了請求過程中發生的情況

reson-phrase 是數字狀態碼的可讀版本

常見的狀態碼以及含義如下:

200 OK 服務器成功處理請求

301/302 Moved Permanently(重定向)請求的URL已移走。響應報文中應該包含一個Location URL,說明資源現在所處的位置

304 Not Modified(未修改) 客戶的緩存資源是最新的,要客戶端使用緩存內容

404 Not Found 未找到資源

501 Internal Server Error 服務器遇到錯誤,使其無法對請求提供服務

HTTP響應示例

HTTP/1.1 200 OK

Content-type: text/plain
Content-length: 12

Hello World!










發佈了90 篇原創文章 · 獲贊 45 · 訪問量 71萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章