Python 后端基础(一):一篇讲清 HTTP 协议,请求和响应到底是什么
HTTP 是前端、后端、浏览器、App、接口测试工具之间沟通的通用格式。学 Python 后端,不懂 HTTP,就会看不懂接口为什么要分 GET/POST,也不明白状态码、请求头、请求体、Cookie、跨域这些问题从哪里来。
【一、HTTP 到底是什么】
HTTP 可以理解成“客户端和服务器说话的规则”。
比如你打开一个网页、点击登录、提交表单、请求一段 JSON 数据,本质上都是客户端向服务器发出一个 HTTP 请求,服务器处理后返回 HTTP 响应。
一个最常见的流程是:
浏览器 / App / Postman
-> 发送 HTTP 请求
-> 后端接口接收请求
-> 校验参数、查数据库、执行业务逻辑
-> 返回 HTTP 响应
-> 前端根据响应展示页面
后端工程师每天写的接口,其实就是在处理 HTTP 请求,然后组织 HTTP 响应。
【二、HTTP 请求由哪些部分组成】
一个 HTTP 请求主要包含四部分:
1. 请求方法:告诉服务器你想做什么。
2. URL 路径:告诉服务器你要操作哪个资源。
3. 请求头:携带额外信息,比如身份、格式、浏览器信息。
4. 请求体:提交的数据,比如登录账号密码、创建文章内容。
例子:
POST /api/v1/login HTTP/1.1
Host: example.com
Content-Type: application/json
{
"username": "tom",
"password": "123456"
}
这里的意思是:客户端向 `/api/v1/login` 这个登录接口提交一段 JSON 数据。
【三、常见请求方法怎么区分】
后端面试很喜欢问 GET 和 POST 的区别,但不要只背“GET 不安全、POST 安全”。更准确的理解是:
| 方法 | 常见用途 | 是否通常带请求体 | 是否应该改变服务器数据 |
|---|---|---|---|
| GET | 查询数据 | 通常不带 | 不应该 |
| POST | 新增数据、提交动作 | 通常带 | 可以 |
| PUT | 全量更新 | 通常带 | 可以 |
| PATCH | 部分更新 | 通常带 | 可以 |
| DELETE | 删除数据 | 可带可不带 | 可以 |
例如:
GET /users/1 查询 id=1 的用户
POST /users 创建用户
PUT /users/1 全量更新用户
PATCH /users/1 修改用户部分字段
DELETE /users/1 删除用户
实际项目里,接口方法不是随便选的。方法语义清楚,前端、后端、测试、文档都会更好协作。
【四、HTTP 响应由哪些部分组成】
服务器返回的响应通常包含:
1. 状态码:告诉客户端请求成功还是失败。
2. 响应头:告诉客户端返回内容的格式、缓存策略等。
3. 响应体:真正的数据内容,通常是 JSON。
例子:
HTTP/1.1 200 OK
Content-Type: application/json
{
"code": 0,
"message": "success",
"data": {
"id": 1,
"username": "tom"
}
}
【五、状态码怎么记】
状态码不要死背所有数字,先按大类记。
| 状态码 | 含义 | 例子 |
|---|---|---|
| 2xx | 成功 | 200 查询成功,201 创建成功 |
| 3xx | 重定向 | 301 永久重定向,302 临时重定向 |
| 4xx | 客户端错误 | 400 参数错,401 未登录,403 无权限,404 不存在 |
| 5xx | 服务端错误 | 500 程序异常,502 网关错误,503 服务不可用 |
面试中最常问的是:
- `401`:没有认证,通常表示没登录或 token 无效。
- `403`:已经认证,但没有权限。
- `404`:资源不存在。
- `500`:服务端代码异常。
举例:用户没带 token 访问个人信息接口,应该返回 `401`;普通用户访问管理员接口,应该返回 `403`。
【六、请求头和请求体有什么区别】
请求头适合放“描述请求的信息”,比如:
Authorization: Bearer xxx
Content-Type: application/json
User-Agent: Chrome
请求体适合放“真正提交的数据”,比如:
{
"title": "Python后端学习路线",
"content": "文章正文"
}
登录 token 通常放请求头里,因为它不是业务数据,而是身份凭证。
【七、Content-Type 是干什么的】
`Content-Type` 用来告诉服务器:我这次提交的数据是什么格式。
常见值:
application/json JSON 数据,后端 API 最常用
application/x-www-form-urlencoded 普通表单
multipart/form-data 文件上传
text/plain 普通文本
如果前端传的是 JSON,但请求头没有写 `Content-Type: application/json`,后端可能解析不到请求体。
【八、Python 后端里怎么体现 HTTP】
FastAPI 示例:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class LoginRequest(BaseModel):
username: str
password: str
@app.post("/api/v1/login")
def login(req: LoginRequest):
if req.username == "tom" and req.password == "123456":
return {"code": 0, "message": "success", "token": "fake-token"}
return {"code": 1001, "message": "用户名或密码错误"}
这里的 `@app.post` 对应 HTTP 的 POST 方法,`/api/v1/login` 是 URL 路径,`LoginRequest` 对应请求体。
【九、常见坑】
- 用 GET 接口提交密码、表单内容等敏感数据。
- 所有失败都返回 200,导致前端和测试无法通过状态码判断问题。
- 参数错误、未登录、无权限全部混用成 500。
- 不设置 `Content-Type`,导致后端解析失败。
- 接口命名随意,比如 `/doUserThing`,后期维护困难。
更多推荐


所有评论(0)