RESTful API设计规范

RESTful API设计

API是现代软件系统的血管,连接着各个组件和服务。一个设计良好的API能让开发者事半功倍,而一个糟糕的API则会成为永恒的噩梦。RESTful API是目前最流行的Web API设计风格,它基于HTTP协议,简洁、清晰、易于理解。在这篇文章中,我将详细介绍RESTful API的设计规范和最佳实践。

REST原则

REST(Representational State Transfer)是一种架构风格,它定义了一组约束条件和原则。RESTful API遵循这些原则:

  • 客户端-服务器分离:关注点分离,提高可移植性
  • 无状态:每个请求包含所有必要信息,服务器不保存会话状态
  • 可缓存:响应应该明确标识是否可缓存
  • 统一接口:使用标准方法、资源标识、标准表示
  • 分层系统:客户端不需要知道连接的是终端服务器还是中间层

资源命名规范

使用名词而非动词

/* 正确:使用名词 */
GET    /users        # 获取用户列表
GET    /users/123    # 获取指定用户
POST   /users        # 创建用户
PUT    /users/123    # 更新指定用户
DELETE /users/123    # 删除指定用户

/* 错误:使用动词 */
GET    /getUsers
POST   /createUser
DELETE /deleteUser/123

使用复数形式

/* 正确 */
/users
/products
/orders

/* 不推荐 */
/user
/product
/order

表达层级关系

/* 用户下的订单 */
GET /users/123/orders       # 用户123的所有订单
GET /users/123/orders/456   # 用户123的订单456

/* 避免过深的嵌套,超过2-3层考虑重构 */
/* 不推荐 */
/users/123/orders/456/items/789/variants

使用小写和连字符

/* 正确 */
/user-profiles
/order-items

/* 错误 */
/userProfiles
/user_profiles
/OrderItems

HTTP方法

方法 操作 是否幂等 是否安全
GET读取资源
POST创建资源
PUT完整更新
PATCH部分更新
DELETE删除资源
/* 创建资源 */
POST /users
Content-Type: application/json

{
  "name": "John Doe",
  "email": "john@example.com"
}

/* 完整更新 */
PUT /users/123
Content-Type: application/json

{
  "name": "John Smith",
  "email": "john.smith@example.com"
}

/* 部分更新 */
PATCH /users/123
Content-Type: application/json

{
  "name": "John Smith"
}

状态码

HTTP状态码

正确使用HTTP状态码让API更加语义化:

成功响应(2xx)

  • 200 OK:请求成功(GET、PUT、PATCH)
  • 201 Created:资源创建成功(POST)
  • 204 No Content:成功但无返回内容(DELETE)

客户端错误(4xx)

  • 400 Bad Request:请求格式错误
  • 401 Unauthorized:未认证
  • 403 Forbidden:已认证但无权限
  • 404 Not Found:资源不存在
  • 409 Conflict:资源冲突(如重复创建)
  • 422 Unprocessable Entity:语义错误
  • 429 Too Many Requests:请求过于频繁

服务器错误(5xx)

  • 500 Internal Server Error:服务器内部错误
  • 503 Service Unavailable:服务不可用

响应格式

成功响应

{
  "data": {
    "id": 123,
    "name": "John Doe",
    "email": "john@example.com",
    "created_at": "2026-03-05T10:00:00Z"
  }
}

列表响应

{
  "data": [
    { "id": 1, "name": "User 1" },
    { "id": 2, "name": "User 2" }
  ],
  "meta": {
    "total": 100,
    "page": 1,
    "per_page": 20,
    "total_pages": 5
  }
}

错误响应

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Validation failed",
    "details": [
      {
        "field": "email",
        "message": "Invalid email format"
      }
    ]
  }
}

版本控制

URL版本

/* 最常用 */
GET /api/v1/users
GET /api/v2/users

Header版本

GET /api/users
Accept: application/vnd.myapi.v2+json

查询参数版本

GET /api/users?version=2

推荐使用URL版本,更直观,便于调试和缓存。

分页、过滤、排序

分页

/* 偏移分页 */
GET /users?page=2&per_page=20

/* 游标分页(适合大数据量) */
GET /users?cursor=abc123&limit=20

过滤

/* 简单过滤 */
GET /users?status=active
GET /users?role=admin

/* 范围过滤 */
GET /users?created_after=2026-01-01
GET /products?price_min=100&price_max=500

/* 搜索 */
GET /users?q=john

排序

/* 单字段排序 */
GET /users?sort=created_at
GET /users?sort=-created_at  /* 降序 */

/* 多字段排序 */
GET /users?sort=-created_at,name

字段选择

/* 只返回指定字段 */
GET /users?fields=id,name,email

安全性

认证

/* Bearer Token */
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

/* API Key */
X-API-Key: your-api-key

HTTPS

所有API必须使用HTTPS,保护数据传输安全。

速率限制

/* 响应头 */
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1617283200

文档

API文档是开发者体验的重要组成部分。推荐使用OpenAPI(Swagger)规范:

openapi: 3.0.0
info:
  title: My API
  version: 1.0.0
paths:
  /users:
    get:
      summary: List users
      parameters:
        - name: page
          in: query
          schema:
            type: integer
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/User'

总结

RESTful API设计不仅仅是技术实现,更是一种艺术。遵循这些规范和最佳实践,你能设计出清晰、一致、易用的API,为开发者带来良好的体验。

记住,好的API设计需要在标准化和灵活性之间找到平衡。在实际项目中,根据团队和业务需求进行适当调整,保持一致性是最重要的。