Stories

Detail Return Return

[前端基礎] HTTP請求GET與POST - Stories Detail

開發中同事問了我一個問題
Q: GET請求能不能用request body來傳遞數據?
這個問題的場景是,他們的前後端溝通需要攜帶複雜的參數,用POST方法的request body(key value)的形式傳參會更加明瞭,但又覺得不夠語義化,所以想到了GET + request body。

A: HTTP規範rfc2616中是沒有對GET方法的使用body做限制( HTTP 規範並未規定GET不能發送 request body ),但發送請求的載體(如瀏覽器、postman)會對GET請求的request body做出限制,chrome會直接把GET請求中的request body置空,Postman,在選擇 GET 時 Body 標籤是灰色不可用的。

在新的規範rfc7231中,明確説明了在GET請求上發送request body可能會導致某些現有實現拒絕該請求。

"A payload within a GET request message has no defined semantics;
sending a payload body on a GET request might cause some existing
implementations to reject the request."

rfc2616
https://www.w3.org/Protocols/... 9.3 GET
rfc7231
https://datatracker.ietf.org/...
Q: GET發請求時URL的長度有限制嗎?

A: HTTP協議未對URL長度做限制,但發送請求的載體(如瀏覽器)會對URL的長度做出限制。不同瀏覽器的長度限制可能存在不同。Chrome將IPC反序列化的url長度限制為2MB。(Chrome is restricting the length of URLs that can be deserialized from IPC to 2MB --出自chromium論壇,2011年, https://bugs.chromium.org/p/c...)
(只記住2MB這個結論。注意2MB不是2048個字符,也不是2000個字符,2MB 相當於 2097152 個字符,這與另一個被廣為流傳的答案-字符長度2000 個字符完全不同,2000字符這個答案的最早出處我無從考究
https://www.geeksforgeeks.org...)

Q: GET請求和POST請求還有哪些不同?
A: GET和POST本質上都是TCP鏈接。但是由於HTTP的規定和瀏覽器/服務器的限制,導致他們在實現上有區別。
對於GET請求,瀏覽器會把request header和data一併發送出去,成功狀態,服務器響應200,返回數據。(只需一次發包)
而對於POST請求,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,成功狀態,服務器響應200 ,返回數據。(兩次發包)

看上去POST需要發包兩次,時間消耗更多一點。但在網絡環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網絡環境差的情況下,兩次包的TCP在驗證數據包完整性上,有非常大的優勢。

注:並不是所有瀏覽器都會在POST中發送兩次包,Firefox就只發送一次。

同步更新到自己的語雀
https://www.yuque.com/diracke...

user avatar front_yue Avatar assassin Avatar hyfhao Avatar happy2332333 Avatar tizuqiudehongcha Avatar hsr2022 Avatar 79px Avatar bianchengsanmei Avatar wojiaocuisite Avatar delia_5a38831addb7b Avatar stephentian Avatar wswx Avatar
Favorites 24 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.