大数跨境
0
0

面试官:写过后端接口吗?REST API 了解多少?

面试官:写过后端接口吗?REST API 了解多少? 拓跋阿秀
2025-12-11
1
 
  
八股文学习网站:https://interviewguide.cn
REST API(Representational State Transfer Application Programming Interface)是一种基于HTTP协议的软件架构风格,用于构建网络应用程序接口。
REST API 是现代 Web 服务开发中最常用的 API 设计模式之一。

REST API 的核心特点包括:

  • 无状态性(Stateless):每个请求都包含处理该请求所需的全部信息
  • 资源导向(Resource-based):所有数据被视为资源,通过 URI 标识
  • 统一接口(Uniform Interface):使用标准 HTTP 方法(GET、POST、PUT、DELETE 等)
  • 可缓存性(Cacheable):响应可以明确标记为可缓存或不可缓存

HTTP 方法对应操作:

HTTP方法
操作类型
描述
GET
读取
获取资源
POST
创建
新建资源
PUT
更新
完整更新资源
PATCH
更新
部分更新资源
DELETE
删除
删除资源

常见 HTTP 状态码:

  • 200 OK - 请求成功

  • 201 Created - 资源创建成功

  • 204 No Content - 成功但无返回内容

  • 400 Bad Request - 客户端错误

  • 401 Unauthorized - 未认证

  • 403 Forbidden - 无权限

  • 404 Not Found - 资源不存在

  • 500 Internal Server Error - 服务器错误


REST API 最佳实践

在开发 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 创建多个用户。

批量操作示例: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. 故障时优雅“降级”

服务器忙时,返回部分数据或限流,保持服务可用。
小贴士:用断路器模式防止故障扩散。

好文推荐

C++ 训练营,来了!

Java/Golang后端训练营,主打一个突击!

阿秀去面腾讯了(社招两年面试经验)

没想到,百度的市值已经连腾讯音乐都不如了。。。

你好,我是阿秀,普通学校毕业,校招时拿到字节跳动SP、百度、华为、农业银行等6个互联网中大厂offer,这是我在校期间的编程学习之路,点击蓝字即可查看我是如何自学技术以应对第二年的校招的全过程。

毕业后我先于抖音部门担任全栈开发工程师,目前在上海某外企带领团队继续从事全栈开发,负责的项目已经顺利盈利300w+。在研三那年就组建了一个阿秀的学习圈,持续分享校招/社招跳槽找工作的经验,目前已经累计服务22、23、24、25、26届同学,共计超过 4400 +人,欢迎点此🔗加入我们,一群人才能走的更远、更稳、更顺。

【声明】内容源于网络
0
0
拓跋阿秀
前字节跳动抖音全栈开发,现某外企项目负责人,分享求职、校招、职场等内容,我的学习笔记网站:interviewguide.cn
内容 974
粉丝 0
拓跋阿秀 前字节跳动抖音全栈开发,现某外企项目负责人,分享求职、校招、职场等内容,我的学习笔记网站:interviewguide.cn
总阅读22
粉丝0
内容974