本文用"大排档"模型,带你从零理解 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 想象成去大排档:
- 你是浏览器,老板是服务器。
- GET 是站在门口问,POST 是走进厨房递食材。
- 状态码是老板脸色:2 成了,3 搬家,4 你错,5 他炸。
- Header 是配料单,Body 是那盘菜。
- HTTP 无状态,老板记性差,Cookie 是会员卡。
- HTTPS 是暗号,防偷听。
最后送你一句口诀:
HTTP 像点菜,GET 问 POST 带。
200 成功 404 菜不在,500 老板炸厨房,301 搬家别乱猜。
无状态像渣男,Cookie 来帮忙,HTTPS 穿裤子,裸奔不安全。
写在最后
下次再有人跟你装 X 聊什么"HTTP 协议底层逻辑",你就问他:
"老板,今天厨房炸了吗?"
他要是愣住,你就把这篇甩他脸上。
散会。