![]()
八股文学习网站:https://interviewguide.cn
REST API 的核心特点包括:
-
无状态性(Stateless):每个请求都包含处理该请求所需的全部信息 -
资源导向(Resource-based):所有数据被视为资源,通过 URI 标识 -
统一接口(Uniform Interface):使用标准 HTTP 方法(GET、POST、PUT、DELETE 等) -
可缓存性(Cacheable):响应可以明确标记为可缓存或不可缓存
HTTP 方法对应操作:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
常见 HTTP 状态码:
200 OK - 请求成功
201 Created - 资源创建成功
204 No Content - 成功但无返回内容
400 Bad Request - 客户端错误
401 Unauthorized - 未认证
403 Forbidden - 无权限
404 Not Found - 资源不存在
500 Internal Server Error - 服务器错误
在开发 Web 应用时,REST API就像是“桥梁”,连接前端和后端,决定了系统的流畅性和用户体验。
一个好的 API 设计不仅能让开发更高效,还能让维护更轻松。
1. 用“名词”给API取名,别用“动词”
API 的地址(端点)应该像“东西”的名字,而不是“动作”。比如,用 /users 表
示用户列表,而不是 /getUsers。
✅ 好的设计: /users, /products, /orders
❌ 不好的设计: /getUsers, /addProduct, /all-orders
为什么? REST API 的核心是“资源”,名词更能体现资源的存在。HTTP方法(如GET、POST)已经说明了操作类型,没必要在地址里重复。
小贴士:
用复数形式(如 /users)表示资源集合,单数(如 /profile)表示单一资源。
用小写字母和连字符(如/user-profiles),保持命名简洁统一。
2. 用 HTTP 方法说清楚你想干啥
HTTP 方法就像 API 的“动词”,每个方法有明确用途:
GET:查数据(比如GET /users/123看ID为123的用户)。
POST:加数据(比如POST /users创建新用户)。
PUT:改数据(整体替换)。
PATCH:改部分数据。
DELETE:删数据。
GET /users # 获取用户列表GET /users/123 # 获取特定用户POST /users # 创建新用户PUT /users/123 # 完全更新用户PATCH /users/123 # 部分更新用户DELETE /users/123 # 删除用户
小贴士:
别用 GET 做修改操作,保持方法用途清晰,防止副作用。
3. 用状态码告诉客户端结果
API 返回的状态码就像“信号灯”,告诉客户端请求成功还是失败。常见的有:
-
200 OK:请求成功
-
201 Created:资源创建成功 -
204 No Content:成功但无返回内容(如DELETE操作) -
400 Bad Request:客户端错误 -
401 Unauthorized:未认证 -
403 Forbidden:无权限 -
404 Not Found:资源不存在 -
409 Conflict:资源冲突 -
500 Internal Server Error:服务器错误
小贴士:
为错误(4xx)提供具体提示,比如{"error": "用户不存在"},方便调试。
4. 让 URL 结构像“文件夹”一样清晰
URL应该像文件夹路径,层次分明。比如,/users/123/orders 表示 ID 为 123 的用户的订单。
小贴士:
别嵌套太深(最好不超过 3 层),否则 URL 会太复杂。
用查询参数(如 /orders?userId=123)处理复杂关系。
5. 给 API 加个“版本号”
API 会不断升级,加版本号(如 /v1/users)能保证旧版客户端还能用。
主要方法:
-
URL 路径版本: /api/v1/users -
查询参数版本: /api/users?version=1 -
请求头版本: Accept: application/vnd.company.v1+json
小贴士:
从第一个版本就用 /v1/,为未来升级留空间。
告诉用户旧版本的“退休”时间(如 6-12 个月)。
6. 支持分页、过滤和排序
返回大量数据时,分页(/users?page=2&size=20)、过滤(/users?role=admin)和排序(/users?sort=name,asc)能让 API 更高效。
分页基本实现:
-
使用 limit和offset或page和size参数 -
在响应中包含分页元数据
GET /products?limit=20&offset=40GET /products?page=3&size=20
过滤排序基本实现:
-
使用查询参数进行过滤: ?status=active -
使用 sort参数进行排序:?sort=created_at -
支持多字段排序和升/降序: ?sort=price:asc,rating:desc
GET /products?category=electronics&price_min=100&price_max=500&sort=price:ascGET /users?role=admin&search=john
小贴士:
设置默认分页(比如 20 条一页),限制最大分页大小(比如 100 条)。
返回总条数等信息,方便客户端显示。
7. 用 JSON 格式,简单又通用
JSON 是 API 的“通用语言”,轻量、易解析。
请求和响应都用 JSON,除非有特殊需求。
小贴士:
字段命名要统一(如用 camelCase 或 snake_case)。
确保返回头有 Content-Type: application/json。
8. 出错时给个“友好”提示
错误响应要清晰,包含错误代码、消息和细节,比如:
{"error": "邮箱格式错误", "code": 400}
小贴士:
定义统一的错误码,方便查问题。
别把服务器的敏感信息(如堆栈跟踪)暴露出去。
9. 设置“速度限制”,保护服务器
限制客户端的请求频率(比如每分钟 100 次),防止服务器被“挤爆”。
X-RateLimit-Limit: 100X-RateLimit-Remaining: 95X-RateLimit-Reset: 1623760800
小贴士:
用头信息(如 X-Rate-Limit-Remaining)告诉客户端还剩多少次请求。
返回 429 状态码,建议稍后重试。
10. 让 API 安全第一
用 HTTPS 加密传输,用 OAuth 2.0 或 API 密钥验证用户身份,确保只有授权用户能访问数据。
-
API密钥:适用于服务间通信 -
OAuth 2.0:适用于第三方授权 -
JWT(JSON Web Tokens):适用于无状态认证
小贴士:
限制跨域访问(CORS),只允许信任的域名。
定期更换 API 密钥,监控异常请求。
11. 写一份“傻瓜式”文档
好的文档就像“说明书”,要包含每个端点的用法、示例和错误说明。
可以用 Swagger 生成交互式文档,Swagger 提供了一种标准化的方式来描述 API 的结构、请求参数、响应格式等信息。
小贴士:
提供测试环境,让开发者快速试用。
保持文档更新,与 API 保持一致。
12. 保证操作“重复安全”
PUT 和 DELETE 操作要“幂等”,意思是重复操作结果一样。比如,多次删除同一个用户不会出错。
小贴士:
对 POST 操作加个“请求 ID”,防止重复提交。
13. 别把敏感信息放 URL 里
URL可能被记录,密码之类的数据要放请求体或头里,别写在URL (如 /users?password=123)。
小贴士:
用 POST 传敏感数据,必要时加密。
检查日志,确保没泄露敏感信息。
14. 响应格式要“整齐划一”
所有 API 返回的格式要一致,比如:
{"data": {...}, "meta": {"page": 1, "total": 100}}
基本结构:
-
使用包装对象,区分数据和元数据 -
保持错误响应格式一致
{"status": "success","data": {"id": 123,"name": "Example Product","price": 99.99},"meta": {"timestamp": "2023-06-15T08:30:00Z"}}
{"status": "error","error": {"code": "VALIDATION_ERROR","message": "Invalid input data","details": [{"field": "email", "message": "Must be a valid email address"}]},"meta": {"timestamp": "2023-06-15T08:30:00Z","request_id": "req-123456"}}
小贴士:
空数据返回空数组 [],别用 null。
加元数据(如分页信息),让客户端更明白。
15. 支持多语言,服务全球用户
通过 Accept-Language 头返回本地化错误消息,比如中文用户看到中文提示。
小贴士:
用标准语言代码(如 zh-CN)。
设置默认语言(如英语)作为备用。
16. 用查询参数做灵活搜索
支持用查询参数过滤和搜索,比如 /orders?status=pending。
小贴士:
参数名要直观,别用模糊的 q。
验证参数,防止安全问题。
17. 支持“批量”操作,省时省力
允许一次处理多条数据,比如 POST /users/batch 创建多个用户。
{"operations": [{"method": "POST", "path": "/users", "body": {"name": "User 1"}},{"method": "PUT", "path": "/users/123", "body": {"name": "Updated User"}}]}
小贴士:
限制批量数量(如 100 条),防止服务器压力过大。
确保操作要么全成功,要么全失败。
18. 监控性能,持续优化
用工具(如 Prometheus)监控 API 的响应时间和错误率,优化慢查询或加缓存。
基本实现:
-
使用 ETags 和 If-None-Match 头 -
设置适当的 Cache-Control 指令
Cache-Control: max-age=3600, must-revalidateETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
小贴士:
用 ETag 或 Cache-Control 缓存频繁请求的数据。
定期测试高并发场景,找出瓶颈。
19. 加“导航链接”,让 API 更聪明
在响应里加资源链接(比如 {"links": {"self": "/users/123"}}),让客户端像逛网页一样导航 API。
小贴士:
用标准格式(如 JSON:API)定义链接。
20. 压缩数据,加快传输
支持 Gzip 或 Brotli 压缩,减少数据量,提升速度。
小贴士:
对小数据(<1KB)关掉压缩,省性能。
21. 用 Webhooks 实时通知
API 可以主动“喊”客户端,比如用户注册时发个 Webhook 通知。
小贴士:
用签名验证 Webhook 安全,支持重试机制。
22. 故障时优雅“降级”
服务器忙时,返回部分数据或限流,保持服务可用。
小贴士:用断路器模式防止故障扩散。
好文推荐
你好,我是阿秀,普通学校毕业,校招时拿到字节跳动SP、百度、华为、农业银行等6个互联网中大厂offer,这是我在校期间的编程学习之路,点击蓝字即可查看我是如何自学技术以应对第二年的校招的全过程。
毕业后我先于抖音部门担任全栈开发工程师,目前在上海某外企带领团队继续从事全栈开发,负责的项目已经顺利盈利300w+。在研三那年就组建了一个阿秀的学习圈,持续分享校招/社招跳槽找工作的经验,目前已经累计服务22、23、24、25、26届同学,共计超过 4400 +人,欢迎点此🔗加入我们,一群人才能走的更远、更稳、更顺。

