從使用角度分析GET和POST的差異性及應用場景

2021-10-18 07:54:10 字數 1874 閱讀 3202

以前只會用get和post,但有時候就會傻傻分不清什麼時候該用get,什麼時候該用post,花了一段時間把這兩個東西給琢磨了一遍,特此記錄一下。

這裡著重講一下get和post一些細節。在講兩者傳輸區別之前,乙個需要注意的就是:很多人一提到位址列的傳參方式,就聯想到get,其實不管是get還是post都可以通過位址url傳遞引數,因為引數屬於url的一部分,服務端只要能獲取url就能獲取其中的引數。很多瀏覽器也對url傳參的大小做了限制,一般是2k位元組數,很多伺服器最多也只處理64k的url。

get請求:

http協議規定get請求一般是將資料放在http的header部分,由於header本身只是作為乙個標識,並不適合傳輸大量的資料,所以最好只用於傳遞一些關鍵引數資訊。get可以被瀏覽器快取,很適合一些請求資源應用場景。

post請求:

http協議規定post請求一般是將資料放在http的body部分。這樣不會受到傳輸資料的大小限制,理論上可以傳輸極大的資料報。不過post請求不能被瀏覽器快取。

http對通過body部分傳輸資料提供很多種(也就是請求頭部對應的content-type屬性),由於太多,就不一一舉例了(有興趣的可以去這裡查閱參考:就拿postman提供的幾種方式作說明:

multipart/form-data:以form表單的方式上傳檔案時就是使用的這種方式。

graphql:graphql 是一種專門用於 api 的查詢語言,有興趣的可以上官網了解下。

下面通過幾個例項來分析這兩種請求的具體用法,用過postman這個工具的同學應該比較熟悉,在postman中不管是get還是post都提供三種傳遞引數的方式。

第一種,使用params,這種傳參方式是將引數放在url的後面進行傳遞,也就是將引數放在http的header中。

我們可以用get和post的方式請求測試一次,然後使用fiddler工具抓包看一下請求和響應的資料,如下圖,左邊是get請求,右邊是post請求(看不清可以放大一點)。

很明顯,雖然get和post都可以使用位址傳遞引數,但最好還是遵守http協議來,讓兩者各司其職比較好。

第二種,將引數儲存到header進行傳遞。

這種傳參方式和第一種都是將資料放到header,嚴格來說沒有太大區別。唯一的區別就是第一種是將引數放在了請求頭第一行的位址後面,而這種方式是將資料放在請求頭的乙個單獨區域中。我也截了get和post兩張圖可以參考看一下。

而且可以看到,不管是get請求還是post請求,我服務端用獲取引數的方法來獲取這個請求引數,是沒有獲取到的,這種請求需要去獲取整個頭部資訊,才能獲取其中對應的值。

這種方式傳遞的引數並不是存在http的頭部,所以可以傳遞的資料量就要大得多。同樣截圖如下。

從圖中可以看到將引數儲存到body,服務端並不能通過常規的get的方式來獲取get請求中的資料,但post的卻可以。

綜上三種方式,其實也可以得到乙個結論:不管從客戶端傳參的角度來看,還是從服務端對解析請求的支援性來看,get都更加適合位址傳遞引數,post更加適合在請求體(body)傳遞引數。

GET和POST的區別,何時使用POST?

get 一般用於資訊獲取,使用url傳遞引數,對所傳送資訊的數量也有限制,一般在2000個字元 post 一般用於修改伺服器上的資源,對所傳送的資訊沒有限制。get方式需要使用request.querystring來取得變數的值,而post方式通過request.form來獲取變數的值,也就是說ge...

GET和POST的區別,何時使用POST?

get 一般用於資訊獲取,使用url傳遞引數,對所傳送資訊的數量也有限制,一般在2000個字元 post 一般用於修改伺服器上的資源,對所傳送的資訊沒有限制。get方式需要使用request.querystring來取得變數的值,而post方式通過request.form來獲取變數的值,也就是說ge...

get 和 post的區別,何時使用post?

get和post的區別 1 get是從伺服器上獲取資料,post是向伺服器傳送資料。2 get是將引數資料加到url中,使用者可以看到。post是將內容放置在http請求資訊體內傳送,使用者看不到這個過程。3 對於get方法,伺服器端是用request.querystring獲取變數的值,對於pos...