你在浏览器输入网址回车,背后发生了什么?答案就是 HTTP--Web 世界的通用语言。本文用 curl 实战拆解请求与响应的每个部分。
1. URL 的结构
https://user:pass@example.com:443/path/page?q=hello#section
└─┬─┘ └──┬──┘ └──┬───┘ └─┬─┘ └──┬───┘ └──┬──┘ └───┬───┘
协议 认证信息 主机名 端口 路径 查询参数 锚点
2. HTTP 请求
一个 GET 请求长这样:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: curl/8.0
Accept: text/html
Cookie: session=abc123
核心要素:方法、路径、版本,加上若干请求头(Header)。
3. 常用请求方法
| 方法 | 语义 | 是否携带 Body | 幂等 |
|---|---|---|---|
| GET | 获取资源 | 否 | ✅ |
| POST | 创建资源 | 是 | ❌ |
| PUT | 整体更新 | 是 | ✅ |
| PATCH | 部分更新 | 是 | ❌ |
| DELETE | 删除资源 | 通常否 | ✅ |
4. HTTP 响应与状态码
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1234
Set-Cookie: lang=zh-CN
<html>...</html>
状态码按百位分组,记住这些就够用:
- 2xx 成功:200 OK、201 Created(已创建)、204 No Content;
- 3xx 重定向:301 永久、302 临时、304 Not Modified(命中缓存);
- 4xx 客户端错误:400 参数错误、401 未登录、403 无权限、404 不存在、429 请求太频繁;
- 5xx 服务端错误:500 服务器内部错误、502 网关错误、503 服务不可用、504 网关超时。
5. curl 实战演练
# 查看响应头
curl -I https://example.com
# 携带请求头
curl -H "Authorization: Bearer TOKEN" https://api.example.com/user
# POST JSON 数据
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name": "Ada"}'
# 跟随重定向并输出详细过程
curl -L -v https://example.com 2>&1 | head -30
6. 无状态与 Cookie
HTTP 本身是无状态的--服务器不记得你。解决方案:服务器通过 Set-Cookie 下发凭证,浏览器之后每次请求自动带上 Cookie 头,实现"登录状态"。如今更常见的是前端存 Token(localStorage)并在请求头中携带。
7. 缓存机制
缓存是 Web 性能的第一大杀器,核心分两类:
- 强缓存:浏览器直接用本地副本,不发请求。由
Cache-Control: max-age=3600控制。 - 协商缓存:带条件发请求,服务器说"没变"就返回 304,浏览器继续用本地副本。
# 响应头示例
Cache-Control: max-age=86400 # 一天内直接用缓存
ETag: "33a64df5" # 内容的指纹
Last-Modified: Wed, 21 Oct 2026 07:28:00 GMT
# 浏览器下次请求会带上
If-None-Match: "33a64df5"
If-Modified-Since: Wed, 21 Oct 2026 07:28:00 GMT
# 服务器比对后没变化 → 304 Not Modified(不返回 body)
经验法则:静态资源(图片、CSS、JS)配长缓存;HTML 页面本身用协商缓存,保证更新能及时生效。
💡 调试利器:浏览器 DevTools → Network 面板能看到每个请求的完整头信息、耗时与瀑布图,是排查问题的最强工具。