API设计最佳实践:构建高质量的RESTful API完整指南

API设计是后端开发的重要技能。本文将介绍API设计的最佳实践,帮助你构建高质量、易用的API。

1. RESTful设计原则

资源导向

# 好的设计
GET    /api/users          # 获取用户列表
GET    /api/users/123      # 获取单个用户
POST   /api/users          # 创建用户
PUT    /api/users/123      # 更新用户
PATCH  /api/users/123      # 部分更新
DELETE /api/users/123      # 删除用户

# 不好的设计
GET    /api/getUsers
POST   /api/createUser
POST   /api/updateUser
POST   /api/deleteUser

HTTP方法

  • GET:获取资源(幂等)
  • POST:创建资源
  • PUT:完整更新资源(幂等)
  • PATCH:部分更新资源
  • DELETE:删除资源(幂等)

HTTP状态码

# 2xx 成功
200 OK               # 成功
201 Created          # 创建成功
204 No Content       # 删除成功

# 3xx 重定向
301 Moved Permanently
304 Not Modified

# 4xx 客户端错误
400 Bad Request     # 请求错误
401 Unauthorized    # 未认证
403 Forbidden       # 无权限
404 Not Found       # 资源不存在
409 Conflict        # 资源冲突
422 Unprocessable   # 验证失败
429 Too Many Requests # 限流

# 5xx 服务端错误
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout

2. 请求与响应

请求格式

# 请求头
Content-Type: application/json
Authorization: Bearer token123
Accept: application/json

# 请求体(JSON)
{
    "name": "Alice",
    "email": "[email protected]",
    "age": 30
}

# 查询参数
GET /api/users?page=1&limit=20&sort=name&order=asc

响应格式

# 成功响应
{
    "code": 200,
    "message": "success",
    "data": {
        "id": 123,
        "name": "Alice",
        "email": "[email protected]"
    },
    "timestamp": "2025-01-15T10:30:00Z"
}

# 分页响应
{
    "code": 200,
    "data": [...],
    "pagination": {
        "page": 1,
        "limit": 20,
        "total": 100,
        "totalPages": 5
    }
}

3. 认证与授权

JWT认证

# 登录获取Token
POST /api/auth/login
{
    "username": "alice",
    "password": "password123"
}

# 响应
{
    "access_token": "eyJhbG...",
    "refresh_token": "eyJhbG...",
    "expires_in": 3600
}

# 使用Token
Authorization: Bearer eyJhbG...

OAuth2

# 授权码模式
1. 客户端跳转到授权服务器
2. 用户授权
3. 获取授权码
4. 用授权码换取access_token

4. 版本管理

# URL路径版本
/api/v1/users
/api/v2/users

# 请求头版本
Accept: application/vnd.myapi.v1+json

# 查询参数版本
/api/users?version=1

5. 错误处理

# 错误响应格式
{
    "code": 400,
    "message": "Validation Failed",
    "errors": [
        {
            "field": "email",
            "message": "Email格式不正确"
        },
        {
            "field": "age",
            "message": "年龄必须大于18"
        }
    ]
}

# 全局错误处理中间件
app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(err.status || 500).json({
        code: err.status || 500,
        message: err.message || 'Internal Server Error',
        errors: err.errors || []
    });
});

6. 限流与安全

限流

# 令牌桶算法
# 每个用户每分钟100次请求

# 响应头
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1609459200

安全头

# 响应头
Content-Security-Policy: default-src 'self'
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

7. 文档规范

OpenAPI/Swagger

openapi: 3.0.0
info:
  title: My API
  version: 1.0.0
paths:
  /api/users:
    get:
      summary: 获取用户列表
      parameters:
        - name: page
          in: query
          schema:
            type: integer
      responses:
        '200':
          description: 成功
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserList'

8. 最佳实践

  • 使用名词而非动词:/users 而非 /getUsers
  • 复数形式:/users 而非 /user
  • 嵌套资源:/users/123/orders
  • 过滤排序:查询参数
  • 分页:page + limit
  • 版本管理:URL或Header
  • 统一响应格式:code + message + data
  • 完善的错误处理:详细的错误信息

9. GraphQL替代方案

# GraphQL查询
query {
    user(id: 123) {
        name
        email
        posts {
            title
            createdAt
        }
    }
}

# 优势
- 按需查询
- 单一端点
- 强类型
- 自文档化

10. API测试

# Postman
# 可视化测试工具

# 自动化测试
# Jest + Supertest
const request = require('supertest');
const app = require('./app');

describe('GET /api/users', () => {
    it('should return users list', async () => {
        const res = await request(app)
            .get('/api/users')
            .expect(200);
        expect(res.body.data).toBeInstanceOf(Array);
    });
});

总结

好的API设计应该:

  • 直观:URL语义清晰
  • 一致:遵循统一规范
  • 安全:认证、限流、安全头
  • 文档完善:OpenAPI/Swagger
  • 易于测试:自动化测试覆盖
📖 进阶学习:学习GraphQL、gRPC、以及API网关(Kong、APISIX)。

发表评论