RESTful API 与 JSON 基础
前后端分离已是主流开发模式:前端调后端接口最常用的风格是 RESTful API,接口间传输数据最常用的格式是 JSON。搞懂这两样,就打通了 Web 开发"接口联调"这一环。
什么是 REST
REST(表征状态转移)是一种接口设计风格而非协议,核心思想是:把一切业务对象看作资源,用 URL 表示资源,用 HTTP 方法表示对资源的操作,用状态码表示结果。
| HTTP 方法 | 语义 | 典型 URL | 是否幂等 |
|---|---|---|---|
| GET | 查询资源 | /api/users/1 | 是 |
| POST | 新建资源 | /api/users | 否 |
| PUT | 整体更新 | /api/users/1 | 是 |
| PATCH | 部分更新 | /api/users/1 | 是 |
| DELETE | 删除资源 | /api/users/1 | 是 |
设计要点:
- URL 只放名词、不放动词:用
/api/users,而不是/api/getUser。 - 资源集合用复数名词,层级用
/表达,如/api/users/1/orders。 - 用 HTTP 状态码表达语义:200 成功、201 创建成功、404 资源不存在、500 服务器错误。
JSON 基础
JSON 是一种轻量级数据交换格式,采用键值对结构,人易读、机器易解析,是 REST API 的默认数据格式。
{
"id": 1,
"name": "张三",
"skills": ["Go", "Python"],
"active": true,
"address": null
}
JSON 共六种值类型:对象、数组、字符串、数字、布尔值、null。注意三点:键必须用双引号、字符串必须用双引号、不允许注释和尾逗号——手写 JSON 报错九成来自这些细节。
用一个小例子串起来
以"用户管理"为例,用 Flask 写一个最小 REST 服务(可直接运行):
from flask import Flask, jsonify, request
app = Flask(__name__)
users = [{"id": 1, "name": "张三"}]
@app.get("/api/users") # GET:查询列表
def list_users():
return jsonify(users)
@app.post("/api/users") # POST:新建用户
def create_user():
body = request.get_json() # 解析请求体里的 JSON
users.append({"id": 2, "name": body["name"]})
return jsonify(users[-1]), 201 # 返回 201 表示创建成功
app.run(port=5000)
用 curl 调用验证:
curl http://localhost:5000/api/users
# 输出:[{"id": 1, "name": "张三"}]
curl -X POST http://localhost:5000/api/users \
-H "Content-Type: application/json" -d '{"name":"李四"}'
# 输出:{"id": 2, "name": "李四"}
设计上易踩的坑与高频问题
- POST 与 PUT 怎么区分:PUT 整体替换且幂等,POST 新建、不幂等;连续两次 POST 会创建两个资源。
- 为什么 REST 强调无状态:服务器不保存客户端会话,每次请求自带全部信息,方便水平扩展。
- 返回结构怎么统一:常用
{"code": 0, "message": "ok", "data": {...}}包装,前端统一解析。 - 版本怎么管理:URL 里带版本号
/api/v1/users,或放在请求头里,避免升级破坏旧客户端。
小结:RESTful 用"名词化 URL + 语义化 HTTP 方法 + 合理状态码"三件套描述接口,JSON 负责承载数据;答接口设计题时先把这三点说清,再谈无状态与统一返回结构,就足够出彩了。