RESTful API设计规范


RESTful API设计最佳实践与规范

RESTful API是现代Web服务架构中最流行的接口设计风格。一个设计良好的API不仅能提高前后端的协作效率,还能降低系统的维护成本。本文将从URL设计、HTTP方法、状态码、认证授权、版本控制等方面,系统地介绍RESTful API的设计规范和最佳实践。

一、URL设计规范

1. 使用名词而非动词

URL应该表示资源,而不是操作。HTTP方法(GET、POST、PUT、DELETE)已经表达了操作的含义:

// 不推荐
GET  /getUsers
POST /createUser
PUT  /updateUser/1
DELETE /deleteUser/1

// 推荐
GET    /users          # 获取用户列表
POST   /users          # 创建用户
PUT    /users/1        # 更新用户1
DELETE /users/1        # 删除用户1

2. 使用复数名词

// 推荐
GET /users            # 用户列表
GET /users/1          # 单个用户
GET /users/1/orders   # 用户1的订单列表

// 不推荐
GET /user
GET /user/1
GET /user/1/order

3. 嵌套资源表达关系

// 用户的文章
GET /users/1/articles
POST /users/1/articles

// 文章的评论
GET /articles/100/comments
POST /articles/100/comments

二、HTTP方法的正确使用

// GET - 获取资源(幂等,不修改数据)
GET /users?page=1&size=20&sort=created_at:desc
GET /users/1

// POST - 创建资源
POST /users
Body: { "name": "张三", "email": "zhangsan@example.com" }

// PUT - 全量更新(幂等)
PUT /users/1
Body: { "name": "李四", "email": "lisi@example.com", "age": 30 }

// PATCH - 部分更新
PATCH /users/1
Body: { "age": 31 }

// DELETE - 删除资源(幂等)
DELETE /users/1

三、状态码与错误处理

正确使用HTTP状态码,让客户端能够准确理解响应含义:

// 成功响应
200 OK          // 成功获取/更新
201 Created     // 成功创建
204 No Content  // 成功删除

// 客户端错误
400 Bad Request           // 请求参数错误
401 Unauthorized          // 未认证
403 Forbidden             // 无权限
404 Not Found             // 资源不存在
409 Conflict              // 资源冲突
422 Unprocessable Entity  // 数据验证失败
429 Too Many Requests     // 请求频率超限

// 服务端错误
500 Internal Server Error // 服务器内部错误
502 Bad Gateway           // 网关错误
503 Service Unavailable   // 服务不可用

统一的错误响应格式

{
    "code": 422,
    "message": "数据验证失败",
    "errors": [
        {
            "field": "email",
            "message": "邮箱格式不正确"
        },
        {
            "field": "age",
            "message": "年龄必须在1-150之间"
        }
    ],
    "request_id": "req_abc123",
    "timestamp": "2024-01-15T10:30:00Z"
}

四、分页与过滤

// 分页参数
GET /users?page=1&per_page=20

// 响应包含分页信息
{
    "data": [...],
    "pagination": {
        "total": 1000,
        "page": 1,
        "per_page": 20,
        "total_pages": 50,
        "has_next": true,
        "has_prev": false
    }
}

// 过滤与排序
GET /users?status=active&role=admin&sort=created_at:desc

// 搜索
GET /users?q=张三&fields=name,email

五、版本控制

// 方式1:URL路径(推荐)
GET /api/v1/users
GET /api/v2/users

// 方式2:请求头
GET /api/users
Header: Accept: application/vnd.myapi.v2+json

六、认证与授权

// JWT Bearer Token
GET /api/v1/users
Header: Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

// API Key(适合服务间调用)
GET /api/v1/users
Header: X-API-Key: your-api-key

七、限流与缓存

// 限流响应头
X-RateLimit-Limit: 100       # 窗口内允许的最大请求数
X-RateLimit-Remaining: 95    # 剩余请求数
X-RateLimit-Reset: 1640000000 # 窗口重置时间

// 超出限流
429 Too Many Requests
Retry-After: 60

// 缓存头
ETag: "abc123"
Cache-Control: max-age=3600
Last-Modified: Mon, 15 Jan 2024 10:00:00 GMT

八、API文档自动化

使用OpenAPI(Swagger)规范编写API文档:

// openapi.yaml
openapi: 3.0.0
info:
  title: 用户管理API
  version: 1.0.0
paths:
  /users:
    get:
      summary: 获取用户列表
      parameters:
        - name: page
          in: query
          schema:
            type: integer
            default: 1
      responses:
        200:
          description: 成功返回用户列表

设计良好的RESTful API是一个持续优化的过程。在项目初期就建立统一的设计规范,并在团队中严格执行,可以避免后期的接口混乱和维护成本。记住,好的API设计要让使用者一目了然,不需要看文档就能猜出接口的用途。


0.073844s