我把 HTTP 协议比喻成大排档点菜,后端同事看完沉默了

8 阅读6分钟

本文用"大排档"模型,带你从零理解 HTTP 协议。没有晦涩概念,只有人话。

前言:为什么你总记不住 HTTP?

很多人一听"HTTP协议"四个字,脑瓜子嗡嗡的。

请求头、响应头、GET、POST、状态码……感觉跟看天书似的。

其实特简单。HTTP 就是两个人说话的故事。 你把这两个人搞明白了,这辈子都忘不掉。


一、HTTP 是啥?就是大排档点菜

想象一个场景。

你是浏览器(客户端),饥肠辘辘。

马路对面有一家大排档(服务器),招牌上写着:

www.laowangchaofen.com

你走过去,扯着嗓子喊:

"老板!来盘炒粉!不要葱,加辣!"

老板在厨房里听见了,探出头回你:

"好嘞!20块!马上好!"

这一来一回,就是一次完整的 HTTP 通信。

  • 你喊的那句话,叫 HTTP 请求(Request)
  • 老板回的那句话,叫 HTTP 响应(Response)
  • 你们俩说话遵守的规矩(你先喊、他后回、说完就闭嘴),就叫 HTTP 协议

协议的本质就是规矩。 没有规矩,你喊"来盘炒粉",老板回你"今天月亮真圆",这饭就没法吃了。


二、GET 和 POST:两种点菜姿势

你去大排档,通常有两种点菜方式。

1. 站在门口喊(GET)

GET /menu/chaofen HTTP/1.1
Host: www.laowangchaofen.com

你只是问问,手里没递东西过去。

GET 请求就是这个意思。 你想从服务器那里点数据,比如打开一个网页、看一张图片、搜一个关键词。

特点: 你的要求全写在 URL 地址栏里,就像你站在门口喊,路过的人都能听见你要吃啥。

2. 走进厨房递食材(POST)

POST /kitchen/cook HTTP/1.1
Host: www.laowangchaofen.com
Content-Type: application/json

{
  "dish": "惠灵顿牛排",
  "material": "自带和牛",
  "requirement": "七分熟"
}

你不但提了要求,还带了东西过去交给老板处理。

POST 请求就是这个意思。 你要往服务器那里提交数据,比如登录账号、发表评论、上传头像。

特点: 你带的东西放在 body 里,不在地址栏显示,相对隐私一点。

一句话记住:

GET 是伸手要,POST 是往里塞。


三、状态码:老板的脸色

老板回你的话,除了内容,还有一个脸色(状态码)。这个脸色是三位数,你扫一眼就知道这顿饭能不能吃上。

状态码老板的脸色人话翻译
200笑嘻嘻"好嘞,菜来了!"(一切正常)
301/302指了指对面"搬那边去了,去那边吃。"(重定向)
400皱眉头"你说的啥玩意儿?我没听懂。"(请求语法错误)
403黑着脸"不卖给你,滚。"(禁止访问)
404摊手"没有这道菜。"(资源不存在)
500厨房冒烟"卧槽,厨房炸了!"(服务器内部错误)

划重点:

  • 2 开头的(200),成了,吃上了。
  • 3 开头的(301/302),搬家了,去别处找。
  • 4 开头的(404/403),你的问题,要么要错了,要么没权限。
  • 5 开头的(500),老板的问题,他那边出 BUG 了。

记住这个顺口溜:

2 成功,3 搬家,4 你错,5 他炸。


四、Header 和 Body:菜里的配料单

老板端上来的炒粉,其实包含两部分:

Header(响应头)= 配料单 + 小票

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 2048
Date: Mon, 28 Apr 2026 00:26:00 GMT
Server: nginx/1.18.0

上面写着:

  • 菜名:Content-Type(这是盘炒粉,还是碗汤)
  • 价格:Content-Length(多大份量)
  • 制作时间:Date
  • 厨师:Server(老王还是 nginx)

这些是"元信息",描述这道菜的数据,不是菜本身。

Body(响应体)= 那盘炒粉

<!DOCTYPE html>
<html>
<head><title>老王炒粉</title></head>
<body>
  <h1>您的炒粉已上桌</h1>
  <p>不要葱,加辣,20元</p>
</body>
</html>

这才是你要的真正内容。 如果是网页,Body 就是 HTML 代码;如果是图片,Body 就是图片的二进制数据;如果是视频,Body 就是视频流。

请求的时候也一样。 你喊的那句话里:

  • Header"我是熟客""我接受加辣""我带了20块钱"
  • Body:(如果是 POST)"这是我要加工的食材,请查收"

五、HTTP 最骚的特性:无状态

HTTP 有个特别渣的特性,叫无状态(Stateless)

啥意思?

老板记性极差。

你刚才要了盘炒粉,付了钱,坐在那儿吃。

五分钟后,你喊:"老板,再加瓶可乐!"

老板抬头问你:"你是谁?你坐哪桌?你刚才点啥了?"

HTTP 每次请求都是独立的。 服务器默认不记得你是谁,不记得你刚才干了啥。

那怎么解决?

Cookie(小饼干)。

你第一次来,老板给你发一张会员卡(Cookie 存在你浏览器里)。下次你再喊,把卡一亮:

GET /order/cola HTTP/1.1
Host: www.laowangchaofen.com
Cookie: table_id=3; preference=no_onion_extra_spicy

"我是 3 号桌那个!"

老板一看卡:"哦,是你啊,炒粉加辣,懂了。"

**Session(会话)**就是老板后厨的小本本,记录着"3 号桌目前点了啥"。


六、HTTPS:加了密的暗号

上面说的 HTTP,有个致命问题:

你站在门口喊"我要炒粉",整条街的人都听见了。

如果这时候你喊的是"我密码是 123456",或者老板回的是"你银行卡余额还有 2 块 5",路过的人全听见了。

HTTPS 就是你们俩开始用暗号交流。

  • 你先把耳朵贴门上,跟老板对个暗号(SSL/TLS 握手)
  • 确认暗号对上了,以后你们说话全部加密
  • 路人只看见你们嘴在动,但不知道说的啥

记住:

HTTP 是裸奔,HTTPS 是穿裤子。


七、终极总结(背下来)

把 HTTP 想象成去大排档:

  1. 你是浏览器,老板是服务器。
  2. GET 是站在门口问,POST 是走进厨房递食材。
  3. 状态码是老板脸色:2 成了,3 搬家,4 你错,5 他炸。
  4. Header 是配料单,Body 是那盘菜。
  5. HTTP 无状态,老板记性差,Cookie 是会员卡。
  6. HTTPS 是暗号,防偷听。

最后送你一句口诀:

HTTP 像点菜,GET 问 POST 带。
200 成功 404 菜不在,500 老板炸厨房,301 搬家别乱猜。
无状态像渣男,Cookie 来帮忙,HTTPS 穿裤子,裸奔不安全。


写在最后

下次再有人跟你装 X 聊什么"HTTP 协议底层逻辑",你就问他:

"老板,今天厨房炸了吗?"

他要是愣住,你就把这篇甩他脸上。

散会。