HTTP 基础
约 1562 字大约 5 分钟
2026-05-10
HTTP 是 Web 世界最重要的应用层协议。浏览器访问网页、前端调用后端 API、Python 脚本请求接口,大多都基于 HTTP。
- 请求与响应
- 请求方法
- 状态码
- Header
- 1用 curl -v https://httpbin.org/get 看完整请求/响应:起始行、Header、空行、Body —— 协议的真实长相。
- 2记常用状态码:200/201/204/301/302/400/401/403/404/429/500/502/503,至少能从含义猜到原因。
- 3区分 GET(幂等、参数走 URL)、POST(写入、参数走 body)、PUT/PATCH(更新)、DELETE(删除)。
- 4JSON 接口请求体永远带 Content-Type: application/json;中文/特殊字符走 URL 时必须编码。
- 5401 是没认证(你是谁),403 是有认证但没权限(你不能),429 要重试 + 退避 —— 别混
HTTP 是 Web 世界最重要的应用层协议。浏览器访问网页、前端调用后端 API、Python 脚本请求接口,大多都基于 HTTP。
请求与响应
HTTP 通信由请求和响应组成。
请求包含:
- 请求方法
- URL
- Header
- Body
响应包含:
- 状态码
- Header
- Body
请求方法
| 方法 | 含义 |
|---|---|
| GET | 获取资源 |
| POST | 创建资源或提交数据 |
| PUT | 整体更新资源 |
| PATCH | 部分更新资源 |
| DELETE | 删除资源 |
GET 请求通常没有请求体,参数放在 query string 中。POST/PUT/PATCH 通常会携带请求体。
状态码
| 范围 | 含义 |
|---|---|
| 2xx | 成功 |
| 3xx | 重定向 |
| 4xx | 客户端错误 |
| 5xx | 服务端错误 |
常见状态码:
- 200 OK:请求成功
- 201 Created:创建成功
- 204 No Content:成功但无响应体
- 301/302:重定向
- 400 Bad Request:请求参数错误
- 401 Unauthorized:未认证
- 403 Forbidden:无权限
- 404 Not Found:资源不存在
- 429 Too Many Requests:请求过多
- 500 Internal Server Error:服务端错误
Header
Header 用来传递元信息,例如:
Content-Type: application/json
Authorization: Bearer token
User-Agent: Python Client常见 Header:
Content-Type:请求体格式Accept:客户端希望接收的格式Authorization:认证信息Cookie:Cookie 信息User-Agent:客户端标识
Body
Body 是请求或响应的主体内容。常见格式:
- JSON:
application/json - Form:
application/x-www-form-urlencoded - 文件上传:
multipart/form-data - 文本:
text/plain - HTML:
text/html
Cookie 与 Session
HTTP 本身是无状态的。Cookie 让服务端可以识别同一个客户端。
服务端可以通过 Set-Cookie 让浏览器或客户端保存 Cookie,后续请求再通过 Cookie Header 带回去。
Session 通常是服务端保存的一份状态,客户端用 Cookie 保存 session id。
HTTPS 与 TLS
HTTPS = HTTP + TLS。TLS 提供:
- 加密传输
- 身份验证
- 数据完整性保护
调用 HTTPS API 时,不要随意关闭证书校验。
幂等性
幂等指的是同一个请求执行一次和执行多次,结果相同。
一般来说:
- GET、PUT、DELETE 通常设计为幂等
- POST 通常不幂等
重试请求时必须考虑幂等性。比如“创建订单”的 POST 如果盲目重试,可能创建多个订单。
用浏览器理解 HTTP
HTTP 不只是 Python 里的库,它也是浏览器每天都在使用的协议。你在浏览器地址栏输入网址后,浏览器会向服务器发请求,服务器再返回响应。
一次最普通的请求可以理解成:
请求:我想要 /articles/1 这个页面
响应:状态码 200,这里是页面内容如果页面不存在,服务器可能返回:
状态码 404,这个资源不存在如果你没有登录,服务器可能返回:
状态码 401,请先登录这样理解后,状态码就不是抽象数字,而是服务器给你的“处理结果”。
GET 和 POST 的直观区别
初学阶段可以先这样理解:
GET:偏“读取”,例如打开文章、搜索商品、查看用户信息。POST:偏“提交”,例如登录、发评论、创建订单。
例如搜索页面常见 URL:
/search?q=python&page=1这里的 q=python&page=1 是 query string,通常用于 GET 请求。
登录表单通常不会把密码放进 URL,而是放在请求体里提交:
POST /login
username=alice&password=******这不是绝对规定,但它是日常 Web 开发里最常见的习惯。
Header 到底有什么用
Header 可以理解成请求或响应的“附加说明”。常见例子:
| Header | 作用 |
|---|---|
User-Agent | 告诉服务器客户端是谁 |
Content-Type | 告诉对方 body 是什么格式 |
Authorization | 携带登录凭证或 Token |
Cookie | 携带浏览器保存的登录态 |
Accept | 告诉服务器希望收到什么格式 |
调用 API 时,经常需要设置:
headers = {
'Authorization': 'Bearer your-token',
'Content-Type': 'application/json',
}如果接口返回 401 或 403,Header 是优先检查对象之一。
JSON 为什么这么常见
现在很多 API 都用 JSON 传数据,因为它简单、跨语言、容易阅读。
一个用户对象可以写成:
{
"id": 1,
"name": "Alice",
"is_active": true
}在 Python 里,JSON 对象通常会变成字典:
data = response.json()
print(data['name'])注意:response.json() 不是“把任何响应都变成 JSON”。如果服务器返回的是 HTML、图片或空内容,它就可能解析失败。
调试 HTTP 的两个好工具
学习 HTTP 时,建议同时使用浏览器开发者工具和 curl。
浏览器开发者工具里看 Network 面板,可以看到:
- 请求 URL
- 请求方法
- 状态码
- Header
- Request Payload
- Response
命令行里可以用:
curl -i https://httpbin.org/get
curl -I https://www.python.org/-i 会显示响应头和响应体,-I 只看响应头。它们能帮助你确认问题是 Python 代码造成的,还是接口本身就这样返回。
总结
HTTP 的核心是请求、响应、方法、状态码、Header 和 Body。写网络程序时,不仅要能发请求,还要理解状态码含义、请求体格式、认证方式和错误处理。
- HTTP 可以理解成客户端发请求、服务端给响应;状态码是服务端的处理结果。
- GET 常用于读取,POST 常用于提交;Header 用来携带格式、身份、Cookie 等附加信息。
- 调试 HTTP 时,多看浏览器 Network 面板和 curl 输出,比只猜代码更可靠。
版权所有
版权归属:Shuo Liu
