1. 程式人生 > >HTTP 請求中 Get 和 Post 區別

HTTP 請求中 Get 和 Post 區別

一、原理區別

一般我們在瀏覽器輸入一個網址訪問網站都是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:狀態碼描述了請求過程中發生的情況。

reason-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!