跳到主要内容

REST 与 API 选择

API 怎样成为调用双方的契约?​

  • API: 应用程序接口,约定请求、参数、结果和错误,使调用方无需知道实现细节也能使用能力;
  • 选择依据: 先明确资源、操作、兼容与权限,再比较调用次数、缓存、工具和传输开销;

REST 如何围绕资源提供统一接口?​

  • REST: 以资源及其表示为核心的架构风格,不是“所有返回 JSON 的 HTTP 接口”的别名;
  • 约束: 客户端与服务端分离、无状态、可缓存、统一接口、分层系统,按需代码为可选约束;
  • 无状态: 每次请求携带解释该请求所需的上下文,不是服务器不允许存数据库或资源状态;
  • 统一接口: 包含资源标识、表示操作、自描述消息和超媒体驱动,可继续学习 HATEOAS;
  • 权衡: 通用 HTTP 工具和缓存方便,但固定响应形状可能过量取数,复杂页面可能多次往返;
HTTP 方法常见语义
GET / HEAD获取表示 / 只获取响应头
POST提交数据并按资源语义处理
PUT创建或整体替换目标资源表示
PATCH对资源进行部分修改
DELETE请求删除目标资源
  • 状态码: 1xx 为信息,2xx 为成功,3xx 为重定向,4xx 为请求方错误,5xx 为服务端错误;
  • 资源示例: GET /users/{id} 读取用户,POST /users 创建用户,路径表达资源、方法表达动作;

如何比较三种接口技术的代价?​

维度RESTGraphQLgRPC
核心表达资源字段查询服务方法
调用次数依资源设计可聚合多个字段依方法粒度与流设计
缓存易利用 HTTP需设计查询及客户端缓存通常在应用层处理
契约与工具可配合 OpenAPI类型模式与工具IDL 与代码生成
兼容演进资源与版本约定字段新增及弃用消息字段与方法兼容
  • 选择原则: 性能、耦合、可发现性和复杂度都取决于实际接口设计,没有天然适合所有系统的冠军;

  • 深入阅读: GraphQL 与 gRPC 分别解释字段查询和远程方法调用;