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`,后期维护困难。

更多推荐