0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HTTP請(qǐng)求方式有哪些

Linux愛好者 ? 來源:狼王編程 ? 作者:狼王 ? 2021-09-02 09:21 ? 次閱讀

相信大家在不管是學(xué)習(xí)、工作或者面試中,肯定會(huì)碰到或被問到HTTP相關(guān)的知識(shí)。今天我們來聊聊有哪些HTTP請(qǐng)求方式,以及區(qū)別吧!

小伙伴們寫過接口或者使用過網(wǎng)頁開發(fā)者模式的,肯定對(duì)以下的內(nèi)容不陌生:

沒錯(cuò),這些就是HTTP 請(qǐng)求的方式。

有一次面試的時(shí)候也被問到了這個(gè)問題,下面我會(huì)以面試的形式呈現(xiàn)給大家,那么就讓我把大家拉到面試的現(xiàn)場吧!

持續(xù)的腳步聲,由遠(yuǎn)及近,隨之會(huì)議室的門被推開了。我起身定睛一看面試官,他那發(fā)際線即將觸碰到后腦勺,大框黑邊眼鏡也掩蓋不住那黝黑的眼圈,顯得格外的程序員。穿著也非常不拘一格,上半身是襯衣西服,下半身是牛仔褲配拖鞋。

我心中的默念:真大佬,無疑了!

隨后面試官就讓我坐下,面試就正式拉開帷幕!

自我介紹以及其他問題此處省略 1w 字……

面試官:平時(shí)開發(fā)過程中,你們常用的 HTTP 請(qǐng)求方法都有哪些???

我:是這樣的,HTTP 1.1 協(xié)議中共定義了八種方法,有時(shí)也叫動(dòng)作,來表明 Request-URL 指定的資源不同的操作方式:

在 HTTP 1.0 中,定義了三種請(qǐng)求方法:GET、POST 和 HEAD 方法。

在 HTTP 1.1 中,新增了五種請(qǐng)求方法:OPTIONS、PUT、DELETE、TRACE 和 CONNECT 方法。但我們常用的一般就是 GET 和 POST 請(qǐng)求。

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

我:(我假裝被難住,然后思考了一會(huì)兒說)這個(gè)……沒有特別去關(guān)注過,但是按照我的理解,大概有這么幾種區(qū)別吧。

GET 請(qǐng)求在 URL 中傳送的參數(shù)是有長度限制的,而 POST 沒有;

GET 比 POST 更不安全,因?yàn)閰?shù)直接暴露在 URL 上,所以不能用來傳遞敏感信息。而 POST 數(shù)據(jù)不會(huì)顯示在 URL 中。是放在 Request body 中;

對(duì)參數(shù)的數(shù)據(jù)類型,GET 只接受 ASCII 字符,而 POST 沒有限制;

GET 請(qǐng)求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里。相反,POST 請(qǐng)求參數(shù)也不會(huì)被瀏覽器保留;

GET 請(qǐng)求只能進(jìn)行 URL 編碼( application/x-www-form-urlencoded),而 POST 支持多種編碼方式;

GET 請(qǐng)求會(huì)被瀏覽器主動(dòng)緩存,而 POST 不會(huì),除非手動(dòng)設(shè)置;

GET 在瀏覽器回退時(shí)是無害的,而 POST 會(huì)再次提交請(qǐng)求。

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

面試官:那 GE嗎?

我:吼吼,看來有機(jī)會(huì)把我昨天精心準(zhǔn)備的東西給他扯半小時(shí)了[手動(dòng)撓頭] 。讓開,我要開始放大招了

其實(shí)吧,GET 和 POST 在本質(zhì)上沒有區(qū)別,都是 HTTP 協(xié)議中的兩種發(fā)送請(qǐng)求的方法。而 HTTP 呢,是基于 TCP/IP 關(guān)于數(shù)據(jù)如何在萬維網(wǎng)中如何通信的協(xié)議。

萬維網(wǎng):簡稱 WWW,是 World Wide Web 的簡稱,也稱為 Web、3W 等。

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

GET 和 POST 能做的事情是一樣一樣的。你要給 GET 加上 Request body,給 POST 帶上 URL 參數(shù),技術(shù)上是完全行的通的。

舉個(gè)栗子吧:(嗯?栗子?好餓,待會(huì)兒面試完去買點(diǎn))

TCP 就像汽車,我們用 TCP 來運(yùn)輸數(shù)據(jù)很可靠,從來不會(huì)發(fā)生丟件少件的現(xiàn)象。

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

為了避免這種情況發(fā)生,交通規(guī)則HTTP誕生了。HTTP 給汽車運(yùn)輸設(shè)定了好幾個(gè)服務(wù)類別,包括 GET、POST、PUT 等等。

HTTP 規(guī)定,當(dāng)執(zhí)行 GET 請(qǐng)求的時(shí)候,要給汽車貼上 GET 的標(biāo)簽(設(shè)置 method為 GET),而且要求把傳送的數(shù)據(jù)放在車頂上(URL 中)以方便記錄。

如果是 POST 請(qǐng)求,就要在車上貼上 POST 的標(biāo)簽,并把貨物放在車廂里(Request body 中)。

當(dāng)然,你也可以在用 GET 時(shí)往車廂內(nèi)偷偷藏點(diǎn)貨物,但這并不不光彩。也可以在POST的時(shí)候在車頂上也放一些數(shù)據(jù),也會(huì)讓人覺得傻乎乎的。

HTTP 只是個(gè)行為準(zhǔn)則,而 GET 和 POST 本質(zhì)上就是 TCP 連接,并無差別。但是由于 HTTP 的規(guī)定和瀏覽器/服務(wù)器的限制,導(dǎo)致他們?cè)趹?yīng)用過程中體現(xiàn)出一些不同。

面試官:哎呀,這小子還真的了解這塊兒啊??磥硎俏艺`會(huì)他了,難道遇到了大佬?

面試官:你說的不錯(cuò),那你剛才說的 URL 中傳送參數(shù)的長度限制在 GET 和 POST 中都是怎么樣的呢?

我:其實(shí)在 Web 中啊,還有另一個(gè)重要的角色——運(yùn)輸公司。

不同的瀏覽器 Client 端(發(fā)起 HTTP 請(qǐng)求)和服務(wù)器 Server 端(接受 HTTP 請(qǐng)求)就是不同的運(yùn)輸公司。

雖然理論上,你可以在車頂上無限的堆貨物(URL 中無限加參數(shù))。但是運(yùn)輸公司可不傻,裝貨和卸貨也是有很大成本的。他們會(huì)限制單次運(yùn)輸量來控制風(fēng)險(xiǎn),數(shù)據(jù)量太大對(duì)瀏覽器和服務(wù)器都是很大負(fù)擔(dān)。

業(yè)界不成文的規(guī)定是,(大多數(shù))瀏覽器通常都會(huì)限制 URL 長度在 2K 個(gè)字節(jié),而(大多數(shù))服務(wù)器最多處理 64K 大小的 URL。超過的部分恕不處理。

如果你用 GET 服務(wù),在 Request body 偷偷藏了數(shù)據(jù),不同服務(wù)器的處理方式也是不同的:有些服務(wù)器會(huì)幫你卸貨讀出數(shù)據(jù),有些服務(wù)器直接忽略。

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

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

我:在約定中,我們的參數(shù)是寫在?后面,用&分割。就像下面這樣:

http://ip:port/test/getHelloWorld?username=langwang&age=26&sex=2

我們知道,解析報(bào)文的過程是通過獲取 TCP 數(shù)據(jù),用正則等工具從數(shù)據(jù)中獲取 Header 和 Body,從而提取參數(shù)。比如header請(qǐng)求頭中添加token,來驗(yàn)證用戶是否登錄等權(quán)限問題。

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

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

我:有人說 POST 比 GET 安全,因?yàn)閿?shù)據(jù)在地址欄上不可見。

然而,從傳輸?shù)慕嵌葋碚f,他們都是不安全的。因?yàn)?HTTP 在網(wǎng)絡(luò)上是明文傳輸?shù)?,只要在網(wǎng)絡(luò)節(jié)點(diǎn)上捉包,就能完整地獲取數(shù)據(jù)報(bào)文。

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

面試官:嗯,不錯(cuò)不錯(cuò),看來你對(duì) HTTP 協(xié)議這塊兒還是有一定了解的,那么你知道GET、POST 請(qǐng)求發(fā)送的數(shù)據(jù)包有什么不同嗎?

我:(看來這面試官是非要是把我問倒才滿意???可惜可惜??次姨茁匪徊ǎ?shí)不相瞞,我上家公司加班比較多,最近剛簽完離職,貴公司是我面的第一家公司,所以準(zhǔn)備的不充分。這樣吧,我大致談?wù)勎业睦斫獍桑粚?duì)的地方您見諒。

面試官:沒關(guān)系,按你的理解聊聊就行。(這小子沒準(zhǔn)備就說成這樣,我的好好考慮一下,別錯(cuò)失了先機(jī),失去一個(gè)能為公司加班的人才)

我:嗯嗯。是這樣的,GET 請(qǐng)求時(shí)產(chǎn)生一個(gè) TCP 數(shù)據(jù)包,POST 請(qǐng)求時(shí)產(chǎn)生兩個(gè) TCP 數(shù)據(jù)包。

GET:瀏覽器會(huì)把 http header 和 data 一并發(fā)送出去,服務(wù)器響應(yīng) 200(返回?cái)?shù)據(jù));

POST:瀏覽器先發(fā)送 header,服務(wù)器響應(yīng) 100 continue,瀏覽器再發(fā)送 data,服務(wù)器響應(yīng) 200 OK(返回?cái)?shù)據(jù))。

就像是 GET 只需要汽車跑一趟就把貨送到了,而 POST 得跑兩趟。

第一趟,先去和服務(wù)器打個(gè)招呼:老鐵,我等下要送一批貨來,你們準(zhǔn)備接收一下哈。然后再回頭把貨送過去。

因?yàn)?POST 需要兩步,理論上時(shí)間上消耗的要多一點(diǎn)。看起來 GET 比 POST 更有效。但并不是,后來發(fā)現(xiàn)原來是個(gè)坑。

在我看來:

GET 與 POST 都有自己的語義,不能隨便混用;

據(jù)研究,在網(wǎng)絡(luò)環(huán)境好的情況下,發(fā)一次包的時(shí)間和發(fā)兩次包的時(shí)間差別基本可以無視。而在網(wǎng)絡(luò)環(huán)境差的情況下,兩次包的 TCP 在驗(yàn)證數(shù)據(jù)包完整性上,有非常大的優(yōu)點(diǎn);

并不是所有瀏覽器都會(huì)在 POST 中發(fā)送兩次包,F(xiàn)irefox 就只發(fā)送一次。我去年用 Chrome 瀏覽器測試發(fā)現(xiàn)也是只發(fā)送一次,所以我認(rèn)為 GET、POST 性能差可以人為忽略。

面試官:嗯,你說的很不錯(cuò),那你稍微等一下啊。

我:(難道還有變故?這波操作難道被發(fā)現(xiàn)了我在套路面試官?不應(yīng)該啊)五分鐘后,面試官拿著一杯飲料走了進(jìn)來……

面試官:你嘗嘗這咖啡味道如何?(自古套路得人心,學(xué)好了)

我喝了一口,豎起大拇指說道:“面試官,這是正宗的卡布奇諾啊,我平時(shí)就喜歡喝,可惜太貴了”。

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

面試官嘴角上翹,微微一笑,露出了潔白的兩顆大門牙說道:

我看你簡歷說你愛喝咖啡。巧了,我們公司有專門的水吧,福利之一就是是每天免費(fèi)一杯咖啡或飲料。以后你可以經(jīng)常喝了。

我:那您的意思是,我面試過了了嗎?太好了!對(duì)了,水吧每天幾點(diǎn)下班吶?跟開發(fā)一個(gè)點(diǎn)兒么?(不會(huì)是因?yàn)榻?jīng)常加班才免費(fèi)喝咖啡吧,我得試探試探)

面試官:哈哈是啊,水吧一直都是按點(diǎn)下班,咱們公司如果有人加班的話,可以自己去水吧做著喝就行,加班時(shí)間都是免費(fèi)的。你這兒沒問題的話,我看下周一就入職吧。

我:好的,面試官,我回去考慮下,到時(shí)候和您聯(lián)系,再見!

至此,本次關(guān)于 HTTP 請(qǐng)求方式,以及 GET 和 POST 的區(qū)別相關(guān)的面試就結(jié)束啦,感謝大家的觀看!

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    478

    瀏覽量

    30759
  • 網(wǎng)頁
    +關(guān)注

    關(guān)注

    0

    文章

    71

    瀏覽量

    19158

原文標(biāo)題:聽我講完 GET、POST 原理,面試官給我倒了杯卡布奇諾

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問如何使用HTTP請(qǐng)求獲取本地時(shí)間?

    我正在嘗試使用 AT 命令和 HTTP 請(qǐng)求獲取本地時(shí)間,我已經(jīng)從中獲得了時(shí)間www.gooogle.com但這個(gè)時(shí)間是GMT時(shí)區(qū), 我想知道如何獲取本地時(shí)區(qū),我已經(jīng)嘗試過 AT CIPNTP,但它不起作用。
    發(fā)表于 07-16 06:20

    如何使用RTOS SDK 2.1.0從esp8266發(fā)送http請(qǐng)求

    我需要從我的 esp8266 向 Shelly 插頭發(fā)出 http 請(qǐng)求才能打開它。如何使用 RTOS SDK 2.1.0 從我的 esp8266 發(fā)送 http 請(qǐng)求?
    發(fā)表于 07-09 06:24

    為什么使用MQTT而不是HTTP

    HTTP最初設(shè)計(jì)用于Web瀏覽,是一種基于請(qǐng)求-響應(yīng)的協(xié)議,客戶端發(fā)起請(qǐng)求,服務(wù)器端響應(yīng)。這種模式簡單直觀,適用于網(wǎng)頁瀏覽、API調(diào)用等場景,
    的頭像 發(fā)表于 06-19 14:26 ?281次閱讀
    為什么使用MQTT而不是<b class='flag-5'>HTTP</b>?

    鴻蒙開發(fā)網(wǎng)絡(luò)管理: @ohos.net.http 數(shù)據(jù)請(qǐng)求

    每一個(gè)httpRequest對(duì)應(yīng)一個(gè)http請(qǐng)求任務(wù),不可復(fù)用
    的頭像 發(fā)表于 06-18 15:42 ?569次閱讀
    鴻蒙開發(fā)網(wǎng)絡(luò)管理: @ohos.net.<b class='flag-5'>http</b>  數(shù)據(jù)<b class='flag-5'>請(qǐng)求</b>

    stm32cube配置lwip,http下發(fā)請(qǐng)求后為什么沒有反饋ACK?

    使用工具查看,3次握手成功,http下發(fā)請(qǐng)求,芯片收到請(qǐng)求后發(fā)送響應(yīng)。但是http下發(fā)請(qǐng)求后,不知道為什么沒有反饋ACK。導(dǎo)致客戶端沒有收到
    發(fā)表于 06-03 07:45

    鴻蒙OS開發(fā)實(shí)戰(zhàn):【網(wǎng)絡(luò)管理HTTP數(shù)據(jù)請(qǐng)求

    應(yīng)用通過HTTP發(fā)起一個(gè)數(shù)據(jù)請(qǐng)求,支持常見的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。
    的頭像 發(fā)表于 04-01 16:31 ?543次閱讀
    鴻蒙OS開發(fā)實(shí)戰(zhàn):【網(wǎng)絡(luò)管理<b class='flag-5'>HTTP</b>數(shù)據(jù)<b class='flag-5'>請(qǐng)求</b>】

    鴻蒙原生應(yīng)用開發(fā)-網(wǎng)絡(luò)管理HTTP數(shù)據(jù)請(qǐng)求

    一、場景介紹 應(yīng)用通過HTTP發(fā)起一個(gè)數(shù)據(jù)請(qǐng)求,支持常見的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 二、接口說明 HTTP數(shù)據(jù)請(qǐng)求
    發(fā)表于 03-29 17:51

    鴻蒙OS開發(fā)實(shí)例:【工具類封裝-http請(qǐng)求

    ;@ohos.promptAction';** **封裝HTTP接口請(qǐng)求類,提供格式化的響應(yīng)信息輸出功能。 使用 DevEco Studio 3.1.1 Release 及以上版本,API 版本為 api 9 及以上
    的頭像 發(fā)表于 03-27 22:32 ?1148次閱讀
    鴻蒙OS開發(fā)實(shí)例:【工具類封裝-<b class='flag-5'>http</b><b class='flag-5'>請(qǐng)求</b>】

    arkts http 發(fā)起請(qǐng)求失敗

    http 發(fā)起請(qǐng)求 官網(wǎng)Http
    發(fā)表于 03-23 00:33

    HTTP協(xié)議的運(yùn)作方式請(qǐng)求/響應(yīng)的步驟

    基于HTTP的客戶/服務(wù)器模式的信息交換過程它分四個(gè)過程建立連接、發(fā)送請(qǐng)求信息、發(fā)送響應(yīng)信息、關(guān)閉連接。
    的頭像 發(fā)表于 02-01 11:02 ?1147次閱讀
    <b class='flag-5'>HTTP</b>協(xié)議的運(yùn)作<b class='flag-5'>方式</b>及<b class='flag-5'>請(qǐng)求</b>/響應(yīng)的步驟

    HTTP 中GET 和 POST 的區(qū)別

    一、概述 HTTP請(qǐng)求報(bào)文 GET 方法的特點(diǎn) POST 方法的特點(diǎn) GET 和 POST 的區(qū)別 二、HTTP請(qǐng)求報(bào)文 首先我們要解決的第一個(gè)問題是:GET 和 POST 是
    的頭像 發(fā)表于 11-11 14:40 ?871次閱讀
    <b class='flag-5'>HTTP</b> 中GET 和 POST 的區(qū)別

    http和https的區(qū)別

    1.1 http協(xié)議格式是什么 請(qǐng)求報(bào)文格式:請(qǐng)求行、請(qǐng)求頭、空一行、請(qǐng)求請(qǐng)求行包括:
    的頭像 發(fā)表于 11-10 16:42 ?2161次閱讀
    <b class='flag-5'>http</b>和https的區(qū)別

    【EsDA 應(yīng)用】快速實(shí)現(xiàn)串口轉(zhuǎn)HTTP請(qǐng)求

    本文將基于EsDA開發(fā)套件快速實(shí)現(xiàn)將串口數(shù)據(jù)轉(zhuǎn)換為HTTP請(qǐng)求的應(yīng)用開發(fā),實(shí)現(xiàn)串口設(shè)備與網(wǎng)絡(luò)服務(wù)的互聯(lián)互通,提供便捷和高效的串口數(shù)據(jù)轉(zhuǎn)換功能。項(xiàng)目簡介HTTP協(xié)議是互聯(lián)網(wǎng)應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議
    的頭像 發(fā)表于 11-09 08:25 ?702次閱讀
    【EsDA 應(yīng)用】快速實(shí)現(xiàn)串口轉(zhuǎn)<b class='flag-5'>HTTP</b><b class='flag-5'>請(qǐng)求</b>

    安信可Ai-WB2模組HTTP 客戶端 POST請(qǐng)求方法

    文章目錄 一、準(zhǔn)備工作 二、連接路由器 三、HTTP客戶端POST請(qǐng)求方法(適用于POST少量數(shù)據(jù)) 四、HTTP 客戶端 POST 請(qǐng)求方法(推薦
    的頭像 發(fā)表于 10-30 17:27 ?541次閱讀
    安信可Ai-WB2模組<b class='flag-5'>HTTP</b> 客戶端 POST<b class='flag-5'>請(qǐng)求</b>方法

    安信可Ai-WB2模組HTTP 客戶端 HEAD和GET 請(qǐng)求方法

    文章目錄 一、準(zhǔn)備工作 二、連接路由器 三、HTTP客戶端HEAD請(qǐng)求方法 四、HTTP 客戶端 GET 請(qǐng)求方法 五、聯(lián)系我們 01 準(zhǔn)備工作 需要準(zhǔn)備的軟硬件:Ai-WB2系列模組
    的頭像 發(fā)表于 10-23 17:41 ?557次閱讀
    安信可Ai-WB2模組<b class='flag-5'>HTTP</b> 客戶端 HEAD和GET <b class='flag-5'>請(qǐng)求</b>方法