面試突擊:GET 和 POST 有什么區(qū)別?
作者 | 磊哥
來(lái)源 | Java面試真題解析(ID:aimianshi666)
轉(zhuǎn)載請(qǐng)聯(lián)系授權(quán)(微信ID:GG_Stone)
GET 和 POST 是 HTTP 請(qǐng)求中最常用的兩種請(qǐng)求方法,在日常開(kāi)發(fā)的 RESTful 接口中,都能看到它們的身影。而它們之間的區(qū)別,也是一道常見(jiàn)且經(jīng)典的面試題,所以我們本文就來(lái)詳細(xì)的聊聊。HTTP 協(xié)議定義的方法類(lèi)型總共有以下 10 種:
PS:目前大部分的網(wǎng)站使用的都是 HTTP 1.1 的協(xié)議。
但在日常開(kāi)發(fā)中,使用頻率最高的就屬 GET 請(qǐng)求和 POST 請(qǐng)求了,尤其是在中、小型公司,基本只會(huì)使用這兩種請(qǐng)求來(lái)實(shí)現(xiàn)一個(gè)項(xiàng)目。
一、相同點(diǎn)和最本質(zhì)的區(qū)別
1、相同點(diǎn)
GET 請(qǐng)求和 POST 請(qǐng)求底層都是基于 TCP/IP 協(xié)議實(shí)現(xiàn)的,使用二者中的任意一個(gè),都可以實(shí)現(xiàn)客戶端和服務(wù)器端的雙向交互。
2、最本質(zhì)的區(qū)別
GET 和 POST 最本質(zhì)的區(qū)別是“約定和規(guī)范”上的區(qū)別,在規(guī)范中,定義 GET 請(qǐng)求是用來(lái)獲取資源的,也就是進(jìn)行查詢(xún)操作的,而 POST 請(qǐng)求是用來(lái)傳輸實(shí)體對(duì)象的,因此會(huì)使用 POST 來(lái)進(jìn)行添加、修改和刪除等操作。當(dāng)然如果嚴(yán)格按照規(guī)范來(lái)說(shuō),刪除操作應(yīng)該使用 DELETE 請(qǐng)求才對(duì),但在實(shí)際開(kāi)發(fā)中,使用 POST 來(lái)進(jìn)行刪除的用法更常見(jiàn)一些。按照約定來(lái)說(shuō),GET 和 POST 的參數(shù)傳遞也是不同的,GET 請(qǐng)求是將參數(shù)拼加到 URL 上進(jìn)行參數(shù)傳遞的,而 POST 是將請(qǐng)參數(shù)寫(xiě)入到請(qǐng)求正文中傳遞的,如下圖所示:
二、本質(zhì)區(qū)別
1、緩存不同
GET 請(qǐng)求一般會(huì)被緩存,比如常見(jiàn)的 CSS、JS、HTML 請(qǐng)求等都會(huì)被緩存;而 POST 請(qǐng)求默認(rèn)是不進(jìn)行緩存的。
2、參數(shù)長(zhǎng)度限制不同
GET 請(qǐng)求的參數(shù)是通過(guò) URL 傳遞的,而 URL 的長(zhǎng)度是有限制的,通常為 2k,當(dāng)然瀏覽器廠商不同、版本不同這個(gè)限制的大小值可能也不同,但相同的是它們都會(huì)對(duì) URL 的大小進(jìn)行限制;而 POST 請(qǐng)求參數(shù)是存放在請(qǐng)求正文(request body)中的,所以沒(méi)有大小限制。
3、回退和刷新不同
GET 請(qǐng)求可以直接進(jìn)行回退和刷新,不會(huì)對(duì)用戶和程序產(chǎn)生任何影響;而 POST 請(qǐng)求如果直接回滾和刷新將會(huì)把數(shù)據(jù)再次提交,如下圖所示:
4、歷史記錄不同
GET 請(qǐng)求的參數(shù)會(huì)保存在歷史記錄中,而 POST 請(qǐng)求的參數(shù)不會(huì)保留到歷史記錄中。
5、書(shū)簽不同
GET 請(qǐng)求的地址可被收藏為書(shū)簽,而 POST 請(qǐng)求的地址不能被收藏為書(shū)簽。
總結(jié)
GET 和 POST 是 HTTP 請(qǐng)求中最常用的兩種請(qǐng)求方法,它們的底層都是基于 TCP/IP 實(shí)現(xiàn)的。它們的區(qū)別主要體現(xiàn)在 5 個(gè)方面:緩存不同、參數(shù)長(zhǎng)度限制不同、回退和刷新不同、歷史記錄不同、能否保存為書(shū)簽不同,但它們最大的區(qū)別是規(guī)范和約定上的不同,規(guī)范中定義 GET 是用來(lái)獲取信息的,而 POST 是用來(lái)傳遞實(shí)體的,并且 GET 請(qǐng)求的參數(shù)要放在 URL 上,而 POST 請(qǐng)求的參數(shù)要放在請(qǐng)求正文中。