聽我講完Http的GET、POST原理,面試官給我倒了杯卡布奇諾

我有一個老朋友,我們叫他熊貓。髮際線及將觸碰到後腦勺,大框金絲眼鏡也掩蓋不住那黝黑的眼圈,顯得格外的“程序員”;穿着也非常“不拘一格”,上半身是襯衣西服,下半身是牛仔褲配拖鞋。

我和熊貓的感情很好,畢業後他去了上海而我開始北漂,但每次過節回老家我倆都會和朋友們一起喫飯,這次回家過年也不例外,我們朋友幾個去了棗莊出名的小板凳醬骨頭,飯後他給我們聊了聊4年前來這家公司的面試經歷,據說跟面試官有着一番精彩的博弈;我們聽得津津有味。

以下是熊貓和麪試官劉經理的對話。


面試官:小李啊,你們常用的HTTP請求方法都有哪些啊?
 

熊貓:是這樣的,HTTP/1.1協議中共定義了八種方法,有時也叫“動作”,來表明Request-URL指定的資源不同的操作方式

  • 在HTTP1.0中,定義了三種請求方法: GET, POST 和 HEAD方法。
  • 在HTTP1.1中,新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法

但我們常用的一般就是GET和POST請求。


面試官:嗯,那你說說GET和POST請求都有哪些區別呢?(果然進套了,看你小子有幾斤幾兩)

熊貓:(其實這就是三十六計第十七計拋磚引玉。我昨晚專門看了陳哈哈的博客,問到上面問題就給面試官放個鉤兒,果然上鉤了。。好,先給他來波官方標準答案,看他怎麼說
 

熊貓:這個。。。沒有太關注過,以我的理解,大概有這麼幾種區別吧:

  1. GET請求在URL中傳送的參數是有長度限制的,而POST沒有。
  2. GET比POST更不安全,因爲參數直接暴露在URL上,所以不能用來傳遞敏感信息。而POST數據不會顯示在URL中。是放在Request body中。
  3. 對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。
  4. GET請求參數會被完整保留在瀏覽器歷史記錄裏;相反,POST請求參數也不會被瀏覽器保留。
  5. GET請求只能進行url編碼(application/x-www-form-urlencoded),而POST支持多種編碼方式。
  6. GET請求會被瀏覽器主動緩存,而POST不會,除非手動設置。
  7. GET在瀏覽器回退時是無害的,而POST會再次提交請求。


面試官:(沒關注過,那你還背的一條不差。跟我擱這兒裝B呢?看我怎麼教育你。)

面試官: 那Get請求有Request body麼?如果有的話參數可以像Post請求一樣放在裏面麼?
 

熊貓:(吼吼,看來有機會把我昨天精心準備的東西給他扯半小時了[手動撓頭]  讓開,我要裝波B了)


熊貓:其實吧,GET和POST在本質上沒有區別,都是HTTP協議中的兩種發送請求的方法。而HTTP呢,是基於TCP/IP的關於數據如何在萬維網中如何通信的協議。 

萬維網:簡稱WWW,是World Wide Web的簡稱,也稱爲Web、3W等


HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP,也就是說,GET/POST都是TCP鏈接。

GET和POST能做的事情是一樣一樣的。你要給GET加上request body,給POST帶上url參數,技術上是完全行的通的。 

舉個例子吧:

TCP就像汽車,我們用TCP來運輸數據,它很可靠,從來不會發生丟件少件的現象。

但是如果路上跑的全是看起來一模一樣的汽車,那這個世界看起來是一團混亂,送急件的汽車可能被前面滿載貨物的汽車攔堵在路上,整個交通系統一定會癱瘓。

爲了避免這種情況發生,交通規則HTTP誕生了。HTTP給汽車運輸設定了好幾個服務類別,包括GET, POST, PUT等等,

HTTP規定,當執行GET請求的時候,要給汽車貼上GET的標籤(設置method爲GET),而且要求把傳送的數據放在車頂上(url中)以方便記錄。

如果是POST請求,就要在車上貼上POST的標籤,並把貨物放在車廂裏(request body中)。

當然,你也可以在用GET的時往車廂內偷偷藏點貨物,但這並不不光彩;也可以在POST的時候在車頂上也放一些數據,也會讓人覺得傻乎乎的。

HTTP只是個行爲準則,而GET和POST本質上就是TCP鏈接,並無差別。但是由於HTTP的規定和瀏覽器/服務器的限制,導致他們在應用過程中體現出一些不同。


面試官:(哎呀,這小子還真的瞭解這塊兒啊,看來是我誤會他了,難道遇到了大佬?)

面試官:小李,你說的不錯,那你剛纔說的URL中傳送參數的長度限制在Get和Post中都是怎麼樣的呢?


熊貓:其實在Web中啊,還有另一個重要的角色:運輸公司。

不同的瀏覽器Client端(發起http請求)和服務器server端(接受http請求)就是不同的運輸公司。

雖然理論上,你可以在車頂上無限的堆貨物(url中無限加參數)。但是運輸公司可不傻,裝貨和卸貨也是有很大成本的,他們會限制單次運輸量來控制風險,數據量太大對瀏覽器和服務器都是很大負擔。

業界不成文的規定是,(大多數)瀏覽器通常都會限制url長度在2K個字節,而(大多數)服務器最多處理64K大小的url。

超過的部分,恕不處理。如果你用GET服務,在request body偷偷藏了數據,不同服務器的處理方式也是不同的,有些服務器會幫你卸貨,讀出數據,有些服務器直接忽略。

所以,雖然GET可以帶request body,卻不能保證一定能被接收到。

示例:
我之前處理過一個bug,用戶反應查詢沒有響應,同事查了日誌後才發現有幾個參數都是undefined,很奇怪,最後發現原來是因爲Get請求第一個查詢參數太長了,導致URL後面的部分服務器無法接收 ,後來把請求改成post,將參數放在request body後就可以了。 


面試官:(看來理論確實是掌握的不錯,讓我考考他實際應用)
面試官:那GET 方法參數寫法是固定的嗎?


熊貓:在約定中,我們的參數是寫在 ? 後面,用 & 分割。如下:

http://ip:port/project/getUserInfo?username=chenhhaha&age=26&sex=2


我們知道,解析報文的過程是通過獲取 TCP 數據,用正則等工具從數據中獲取 Header 和 Body,從而提取參數。

比如header請求頭中添加token,來驗證用戶是否登錄等權限問題。

也就是說,我們可以自己約定參數的寫法,只要服務端能夠解釋出來就行,萬變不離其宗。

面試官:那麼說來,是不是POST 方法比 GET 方法更安全呢?


熊貓:有人說POST 比 GET 安全,因爲數據在地址欄上不可見。

然而,從傳輸的角度來說,他們都是不安全的,因爲 HTTP 在網絡上是明文傳輸的,只要在網絡節點上捉包,就能完整地獲取數據報文。

其實,要想安全傳輸,就只有加密,也就是 HTTPS。


面試官:嗯,不錯小李,看來你對HTTP協議這塊兒還是有一定了解的,那麼你知道Get、Post請求發送的數據包有什麼不同嗎?
 

熊貓:(看來這面試官是非要是把我問倒才滿意啊?可惜可惜。看我套路他一波)


熊貓: 實不相瞞,我上家公司加班比較多,昨天剛簽完離職,貴公司是我面得第一家公司,所以準備的不充分,這樣吧,我大致談談我的理解吧,不對的地方您見諒。


面試官:沒關係,按你的理解聊聊就行。(這小子沒準備就說成這樣,我的好好考慮一下,別錯失了先機,失去一個能爲公司“加班”的人才)

熊貓: 嗯嗯,是這樣的,GET請求時產生一個TCP數據包;POST請求時產生兩個TCP數據包。

  • GET:瀏覽器會把http header和data一併發送出去,服務器響應200(返回數據);
  • POST:瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 OK(返回數據)。

就像是GET只需要汽車跑一趟就把貨送到了,而POST得跑兩趟,第一趟,先去和服務器打個招呼“老鐵,我等下要送一批貨來,你們準備接收一下哈”,然後再回頭把貨送過去。

因爲POST需要兩步,理論上時間上消耗的要多一點,看起來GET比POST更有效。但並不是,後來發現原來是個坑。在我看來:

GET與POST都有自己的語義,不能隨便混用。
據研究,在網絡環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網絡環境差的情況下,兩次包的TCP在驗證數據包完整性上,有非常大的優點。
並不是所有瀏覽器都會在POST中發送兩次包,Firefox就只發送一次。我去年用Chrome瀏覽器測試發現也是隻發送一次,所以我認爲Get、POST性能差可以人爲忽略。
 

學習技術的朋友們就到此爲止了,感覺學到東西的記得幫忙點個贊哦,麼麼噠。


面試官:小李,你說的很不錯,你等一等啊;

熊貓:(溜了??不應該啊,我這波操作難道還不香麼?難道,他也看了陳哈哈的博客,被識破了?? -_-''|)

 

五分鐘後,面試官拿着一杯飲料進來。。。。

面試官:小李啊,你嚐嚐這咖啡味道如何?(自古套路得人心,學好了)


熊貓喝了一口,豎起大拇指說到:劉經理,這是正宗的卡布奇諾啊,我平時就喜歡喝,可惜太貴了。。

咦?我進來之前沒有看到你們這有咖啡店呀,這是?

面試官嘴角上翹,微微一笑,露出了潔白的兩顆大門牙:小李,我看你簡歷說你愛喝咖啡,巧了,我們公司有專門的水吧,福利之一就是是每天免費一杯咖啡或飲料。以後你可以經常喝了。
面試官:(這個福利,其實是因爲我們公司加班多才提出的。別問,問我也不會說~~)

熊貓:劉經理意思是,我面試過了是麼,太好了!

熊貓:對了水吧每天幾點下班吶?跟開發一個點兒麼?(不會是因爲經常加班才免費喝咖啡吧,我得試探試探)
 

面試官:(這問題我聽了無數次了,看我滴水不漏的模糊作答 ---- 真·老油子)
面試官:哈哈是啊,水吧一直都是按點下班,咱們公司如果有人加班的話,可以自己去水吧做着喝就行,加班時間都是免費的。


面試官:小李,你這兒沒問題的話,我看下週一就入職吧。

熊貓:(聽他話的意思公司應該只是偶爾加班啊,這簡直讓我無法拒絕啊!咦,總感覺不太對。。)
熊貓:好的劉經理,那咱們下週見。
————————————————

原文鏈接:https://blog.csdn.net/qq_39390545/article/details/105616407

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章