🍕HTTP and RESTful API
约 798 字大约 3 分钟
HTTPRESTful API
2025-04-16
HTTP(HyperText Transfer Protocol)是应用层协议,基于 TCP/IP,采用请求-响应模式,是 Web 通信的基础。
请求/响应格式

| 组成部分 | 请求 | 响应 |
|---|---|---|
| 起始行 | 方法 + URL + 版本 | 版本 + 状态码 + 描述 |
| 头部 | Host、Content-Type、Authorization 等 | Content-Type、Content-Length 等 |
| 空行 | 分隔头部与主体 | 分隔头部与主体 |
| 主体 | 请求数据(可选) | 响应数据(可选) |
请求方法
| 方法 | 语义 | 幂等性 | 安全性 |
|---|---|---|---|
| GET | 获取资源 | 是 | 是 |
| POST | 创建资源 | 否 | 否 |
| PUT | 全量更新 | 是 | 否 |
| PATCH | 部分更新 | 否 | 否 |
| DELETE | 删除资源 | 是 | 否 |
| HEAD | 获取头部(无主体) | 是 | 是 |
| OPTIONS | 查询支持的方法 | 是 | 是 |
提示
- 幂等性:多次请求结果相同
- 安全性:不修改服务器状态
状态码
| 范围 | 类型 | 常见状态码 |
|---|---|---|
| 1xx | 信息 | 100 Continue、101 Switching Protocols |
| 2xx | 成功 | 200 OK、201 Created、204 No Content |
| 3xx | 重定向 | 301 Moved Permanently、302 Found、304 Not Modified |
| 4xx | 客户端错误 | 400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found |
| 5xx | 服务端错误 | 500 Internal Server Error、502 Bad Gateway、503 Service Unavailable |
Content-Type
指示请求/响应主体的媒体类型(MIME)。
| 场景 | 请求 | 响应 |
|---|---|---|
| 作用 | 告知服务器如何解析请求体 | 告知客户端如何处理响应体 |
| 发起方 | 客户端 | 服务器 |
常见类型
| Content-Type | 说明 | 场景 |
|---|---|---|
application/json | JSON 格式 | API 数据交互 |
application/x-www-form-urlencoded | 表单编码 | HTML 表单提交 |
multipart/form-data | 多部分表单 | 文件上传 |
text/html | HTML 文档 | 网页 |
text/plain | 纯文本 | 日志、配置 |
application/octet-stream | 二进制流 | 文件下载 |
HTTP vs HTTPS
| 特性 | HTTP | HTTPS |
|---|---|---|
| 端口 | 80 | 443 |
| 加密 | 无 | TLS/SSL |
| 证书 | 不需要 | 需要 CA 证书 |
| 安全性 | 明文传输 | 加密传输 |
模拟网页请求
socket_1.py
import socket
sock = socket.socket()
sock.bind(("127.0.0.1", 9090))
sock.listen(5)
while True:
conn, addr = sock.accept()
data = conn.recv(1024)
print("请求内容:\n", data)
conn.send(b"HTTP/1.1 200 OK\r\n\r\nhello, world")
conn.close()socket_2.py
import socket
sock = socket.socket()
sock.bind(("127.0.0.1", 9090))
sock.listen(5)
while True:
conn, addr = sock.accept()
data = conn.recv(1024)
print("请求内容:\n", data)
conn.send(b"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>Hello, world</h1>")
conn.close()RESTful API
REST(Representational State Transfer)是一种 API 设计风格,核心原则:
- 资源导向:URL 表示资源,而非操作
- 统一接口:使用 HTTP 方法表达操作语义
- 无状态:每个请求包含所有必要信息
接口设计示例
| 方法 | URL | 操作 |
|---|---|---|
| POST | /students | 创建学生 |
| GET | /students | 获取所有学生 |
| GET | /students/ | 获取指定学生 |
| PUT | /students/ | 全量更新学生 |
| PATCH | /students/ | 部分更新学生 |
| DELETE | /students/ | 删除学生 |
设计规范
- URL 使用名词复数(
/students而非/student) - 使用 HTTP 方法表示操作(避免
/getStudent、/deleteStudent) - 使用路径参数表示资源 ID(
/students/1) - 使用查询参数表示筛选/分页(
/students?page=1&limit=10) - 返回合适的状态码(201 Created、204 No Content 等)
响应格式
// 成功响应
{
"code": 200,
"data": { "id": 1, "name": "Alice" },
"message": "success"
}
// 错误响应
{
"code": 404,
"data": null,
"message": "Student not found"
}