目录

如何在技术面试中搞定 API 设计题

API 设计面试已经悄然成为现代软件工程招聘中最重要的环节之一。无论你申请的是后端、全栈还是平台工程岗位,几乎都会面对关于如何设计简洁、可扩展且对开发者友好的 API 的问题。本文将详细拆解面试官的评判标准,以及如何组织出高分回答。

为什么公司如此重视 API 设计

API 是连接分布式系统的契约。设计糟糕的 API 会带来数年的技术债务,让使用者困惑不已,也会让向后兼容变成一场噩梦。面试官通过 API 设计环节来评估你是否具备长期可维护性的思维,而不仅仅是短期功能实现。

与纯算法题不同,API 设计题考察的是技术深度和产品思维的结合。你需要考虑谁会使用这个 API、他们的使用场景是什么、接口将如何演进。这也是为什么用 AI 面试助手 来备考能带来显著帮助——它可以帮你在时间压力下练习清晰地表达设计权衡。

核心框架:如何应对任何 API 设计题

当面试官说"请设计一个 X 的 API"时,按照以下结构化方法来回答:

第一步:澄清需求

永远不要直接跳到端点设计。先问问题:

  • 谁是使用者? 内部服务、第三方开发者还是移动客户端?
  • 主要使用场景是什么? 读多还是写多?实时还是批量?
  • 规模预期如何? 每秒几百个请求还是几百万个?
  • 需要什么样的一致性保证? 最终一致性可以接受还是必须强一致?

第二步:定义资源模型

识别核心实体及其关系。例如,设计一个任务管理 API:

  • 工作区 (Workspace) → 包含多个 项目 (Project)
  • 项目 (Project) → 包含多个 任务 (Task)
  • 任务 (Task) → 有一个 负责人 (Assignee),多个 评论 (Comment)

把它画出来。面试官喜欢看到你在设计端点之前先思考领域模型。

第三步:设计端点

以 RESTful 规范作为默认方案,然后在适当的地方讨论替代方案:

GET    /api/v1/projects/{project_id}/tasks
POST   /api/v1/projects/{project_id}/tasks
GET    /api/v1/tasks/{task_id}
PATCH  /api/v1/tasks/{task_id}
DELETE /api/v1/tasks/{task_id}

面试官的评估要点:

  • 命名一致性:集合用复数名词,URL 中不用动词
  • 正确的 HTTP 方法:GET 用于读取,POST 用于创建,PATCH 用于部分更新,PUT 用于完整替换
  • 有意义的状态码:201 表示创建,204 表示删除,409 表示冲突

第四步:处理分页、过滤和排序

这是很多候选人容易丢分的地方。务必讨论:

GET /api/v1/tasks?status=open&assignee=user123&sort=-created_at&limit=20&cursor=abc123
  • 游标分页优于偏移量分页(适用于大数据集)——解释原因(offset 跳过是 O(n),游标是 O(1))
  • 常用字段通过查询参数进行过滤
  • 使用清晰的约定进行排序(前缀 - 表示降序)

第五步:讨论认证、限流和版本管理

用运维层面的考量来完善你的回答:

  • 认证:第三方 API 使用 OAuth 2.0 + JWT,内部服务间通信使用 API Key
  • 限流:令牌桶算法,返回 429 Too Many Requests 并附带 Retry-After
  • 版本管理:URL 路径版本化(/v1/)简单直接,或使用请求头版本化提供更大灵活性

REST vs. GraphQL vs. gRPC:何时推荐哪种方案

面试官经常要求你比较不同的 API 范式。以下是简洁的决策矩阵:

评判标准 REST GraphQL gRPC
最适合 公共 API、CRUD 操作 前端驱动的查询 微服务间通信
优势 简单、可缓存、广泛认知 灵活查询、无过度获取 高性能、强类型
劣势 过度获取、多次往返 缓存复杂、N+1 风险 浏览器不友好
版本管理 URL 或请求头 Schema 演进 Proto 文件版本化

获胜的回答永远不是"总是用 X",而是"考虑到这些权衡,我会选择 X,因为……"

常见错误:让你痛失这一轮的陷阱

1. 在真空中设计。 不问澄清问题意味着你在不理解需求的情况下就开始构建功能。

2. 忽视错误处理。 尽早定义你的错误响应格式:

{
  "error": {
    "code": "TASK_NOT_FOUND",
    "message": "No task found with ID 'abc123'",
    "details": []
  }
}

3. 忘记幂等性。 对于 POST 和 PATCH 操作,要讨论幂等性键以安全处理重试。

4. 忽略向后兼容。 永远不要在现有版本中删除或重命名字段。添加新字段,废弃旧字段。

5. 跳过安全性。 始终提及输入验证、授权检查(不仅仅是认证)和数据清理。

如何高效练习 API 设计

最好的准备方式是大声练习设计 API,模拟真实的面试环境。以下是经过验证的方法:

  • 研究真实世界的 API:Stripe、Twilio 和 GitHub 有优秀的公开 API 文档。阅读他们的设计决策并理解背后的原因。
  • 进行模拟面试:使用 OfferBull 来模拟 API 设计面试环节。获得实时反馈可以帮你在正式面试前发现推理中的漏洞。
  • 阅读 API 设计指南:Google 的 API Design Guide 和 Microsoft 的 REST API Guidelines 是行业金标准。
  • 计时练习:大多数 API 设计面试为 45 分钟。练习在 35 分钟内完成完整设计,留出提问时间。

示例题目详解:设计一个短链接 API

以下是一个优秀回答的示范:

需求澄清:面向开发者的公共 API。预期规模:1 亿条短链接,每月 10 亿次重定向。需要数据分析功能。

资源模型:ShortURL (id, original_url, short_code, created_at, expires_at, user_id)

核心端点

POST   /api/v1/urls          → 创建短链接(返回 201)
GET    /api/v1/urls/{code}   → 获取链接元数据(返回 200)
DELETE /api/v1/urls/{code}   → 删除短链接(返回 204)
GET    /{code}               → 重定向(返回 301/302)
GET    /api/v1/urls/{code}/analytics → 获取点击分析数据

设计决策

  • 使用 301(永久重定向)以利于 SEO,如果更看重分析数据准确性则使用 302(临时重定向)
  • 使用 Base62 编码生成短码(a-z, A-Z, 0-9),保持 URL 紧凑
  • 创建操作限流为每个 API Key 每小时 100 次,重定向不限流(从缓存提供)
  • 在 Redis 中缓存热门 URL,TTL 与过期时间匹配

这种细节程度——覆盖功能、性能和运维层面——正是区分"录用"和"不录用"的关键。


掌握你的职业发展方向

API 设计面试奖励结构化的思维和清晰的表达。最优秀的候选人不只是知道正确的模式——他们能在压力下解释自己的推理过程。今天就开始练习,满怀信心地走进下一场面试。