REST API JSON最佳实践

API设计规范与JSON格式最佳实践,帮助您设计高质量、易用的RESTful API。

响应格式最佳实践

统一响应格式

保持API响应格式的一致性,便于客户端处理。

推荐写法
{
  "code": 200,
  "message": "success",
  "data": {
    "id": 1,
    "name": "张三"
  },
  "timestamp": 1704067200
}
不推荐写法
// 不同接口格式不一致
// GET /user/1
{"id": 1, "name": "张三"}

// GET /users
[{"id": 1, "name": "张三"}]

// POST /user
{"success": true, "user": {...}}
  • 使用统一的响应结构
  • 包含状态码和消息
  • 数据包裹在data字段中
  • 添加时间戳便于调试

错误响应处理

提供清晰的错误信息,帮助开发者快速定位问题。

推荐写法
{
  "code": 400,
  "message": "参数错误",
  "errors": [
    {
      "field": "email",
      "message": "邮箱格式不正确"
    },
    {
      "field": "password",
      "message": "密码长度至少8位"
    }
  ],
  "request_id": "req_abc123"
}
不推荐写法
{
  "error": "Bad Request"
}
  • 使用HTTP状态码表示错误类型
  • 提供详细的错误字段信息
  • 包含请求ID便于追踪
  • 错误消息要具体可操作

分页响应格式

列表数据需要分页时,返回完整的分页信息。

推荐写法
{
  "code": 200,
  "data": {
    "items": [...],
    "pagination": {
      "page": 1,
      "page_size": 20,
      "total": 100,
      "total_pages": 5,
      "has_next": true,
      "has_prev": false
    }
  }
}
不推荐写法
{
  "items": [...],
  "total": 100
}
  • 提供完整的分页元数据
  • 包含has_next/has_prev便捷判断
  • 使用page/page_size参数
  • 支持cursor分页处理大数据

嵌套资源处理

合理处理关联资源,避免过度嵌套或N+1查询。

推荐写法
// 方案1: 包含简要信息
{
  "id": 1,
  "title": "文章标题",
  "author": {
    "id": 101,
    "name": "张三",
    "avatar": "https://..."
  }
}

// 方案2: 引用ID + 可选展开
{
  "id": 1,
  "title": "文章标题",
  "author_id": 101,
  "author": null  // 需要时通过include参数展开
}
不推荐写法
// 过度嵌套
{
  "id": 1,
  "author": {
    "id": 101,
    "posts": [{
      "id": 1,
      "comments": [...]
    }]
  }
}
  • 关联资源返回摘要信息
  • 支持include参数展开资源
  • 避免深度嵌套(建议不超过3层)
  • 考虑使用GraphQL处理复杂查询

HTTP状态码使用指南

状态码描述使用场景
200成功GET、PUT、PATCH请求成功
201创建成功POST请求成功创建资源
204无内容DELETE请求成功,无返回内容
400请求错误参数验证失败、格式错误
401未认证缺少或无效的身份认证
403禁止访问无权限访问该资源
404未找到资源不存在
409冲突资源冲突(如重复创建)
422无法处理语义错误(如验证失败)
429请求过多触发速率限制
500服务器错误服务器内部错误
503服务不可用服务维护或过载

性能优化建议

使用gzip压缩

JSON文本压缩率高,可减少70%以上传输体积。

// 响应头
Content-Encoding: gzip

// 压缩效果对比
原始大小: 45KB
压缩后: 12KB
压缩率: 73%

字段过滤

允许客户端指定需要的字段,减少不必要的数据传输。

// GET /users/1?fields=id,name,email
{
  "id": 1,
  "name": "张三",
  "email": "zhang@example.com"
  // 不返回其他字段如bio, avatar等
}

批量接口

提供批量查询和批量操作接口,减少请求次数。

// 批量查询
POST /users/batch
{
  "ids": [1, 2, 3, 4, 5]
}

// 批量响应
{
  "data": [
    {"id": 1, "name": "用户1"},
    {"id": 2, "name": "用户2"},
    ...
  ]
}

缓存策略

合理使用HTTP缓存头,减少重复请求。

// 响应头设置缓存
Cache-Control: public, max-age=3600
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

// 客户端可以使用ETag验证
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
// 服务端返回304 Not Modified

安全注意事项

敏感数据脱敏

不要在响应中返回敏感信息,如密码、token等。

  • 密码字段永不在响应中出现
  • Token只返回一次,后续使用ID引用
  • 手机号、邮箱部分隐藏
  • 身份证号中间位隐藏

输入验证

严格验证所有输入数据,防止注入攻击。

  • 验证JSON数据类型
  • 检查字段长度限制
  • 过滤危险字符
  • 使用JSON Schema验证

速率限制

实施API速率限制,防止滥用。

  • 返回限流头信息
  • 区分认证/未认证用户
  • 按IP或用户ID限制
  • 提供重试时间信息

在线JSON格式化工具

验证、格式化、修复您的API JSON数据

打开工具