說明:以下內容如有侵權,請聯系刪除
從HTTP協議的角度來說
參數:get通過url進行傳遞,post放在request body中
安全:get由於直接將參數暴露在url中,所以不能用來傳遞敏感信息,而post請求就不會有這個問題
編碼:get只能進行url編碼,而post支持多種編碼合適
速度:由於get的data都在url里面所以速度較快(如果在網絡環境好的情況下和這個差距可以忽略,反而在網絡環境差的情況下兩次TCP在驗證數據的完整性上,有更大的優點)
緩存:get請求可以被瀏覽器緩存,post請求不會被瀏覽器緩存
數據包:get由於data都在url里面,所以只會產生一個TCP數據包(header和data)。由於post將數據放在request body中,所以會產生兩個TCP數據包(一個是header數據包,另一個是data數據包)
從瀏覽器的角度來說
長度:get請求在url的長度是有限制的,而post沒有(這個限制是來自瀏覽器和web服務器對url 的限制,並不是http協議的),大多數瀏覽器通常都會限制url長度在2K個字節,而大多數服務器最多處理64K大小的url
數據包:get由於data都在url里面,瀏覽器會把http的header和data一並發送,所以只產生一個數據包,服務器響應200;post,瀏覽器先發送header,服務器響應100 continue,瀏覽器在發送data,服務器響應200 ok(不過這不是post的必然行為,是部分瀏覽器或框架的請求方式)
本質
本質上來說,get和post並沒有差別,底層都是tcp/ip協議,但是由於http的規定和瀏覽器、服務器的限制,導致它們在應用過程中出現了不同的形式
GET請求是否可以有請求體
http只是規定了get請求的參數通過url傳遞。從技術角度上來說,get請求是可以有請求體的。如果用get服務,在request body中添加了數據,不同服務器的處理方式也是不同的,有些服務器會幫你讀取數據,有些服務器直接忽略。所以,雖然GET可以帶request body,也不能保證一定能被接收到。
常見的瀏覽器是遵循http協議的,由於http協議規定get請求將數據通過url傳遞,post請求將數據通過請求體傳遞,所以對於常見的瀏覽器發出的get請求是沒有請求體的。可能由於這點原因,有些人可能會認為get請求不可能有請求體,這個觀點是錯誤的。因為http協議只是規定了get請求將數據通過url傳遞,並沒有規定get請求不能有請求體,可以通過技術手段使發出的get請求有請求體。
對於常見的瀏覽器對於get請求,都是將數據通過url傳遞,並沒有請求體,如果想使用常見的瀏覽器發出get請求有請求體是非常難的,除非改動瀏覽器的源代碼,可以使用其他技術手段來使發出的get請求有請求體。
補充
對於get請求來說,由於一般都是通過url傳遞數據。所以當請求參數中包括一些特殊字符,例如大括號、中括號等等,可以能導致url發送失敗,原因可能就是url中不能含有一些特殊字符,報錯的提示信息可能是參數不規范。所以json串都是通過post請求發送,因為json串中包含大括號等字符。
對於post請求是沒有這個問題的,因為post請求將數據放到請求體中發送,並不會拼接到url上,在請求體中對字符沒有要求。