Scroll
JSON:API 与核心 REST 模块对比
要点速览(TL;DR)
如果你需要暴露非实体(non-entity)数据,请选择 REST。其他情况下,选择 JSON:API。
更细化一些的说明:
- 核心 REST 模块几乎允许做任何事情(任意格式、任意逻辑、任意 HTTP 方法),且可配置性极强。功能强大,但也更复杂,因此相对更脆弱。
- JSON:API 专注于以一致的方式暴露 Drupal 的最大优势(实体/数据建模)。简单,但对大多数用例已足够强大。
特性对比矩阵
特性 | JSON:API | REST | 备注 |
---|---|---|---|
将实体作为资源暴露 | ✔️ | ✔️ | REST:需要为每个实体类型单独配置。JSON:API:默认全部暴露。两者均会遵循实体访问控制。 |
将自定义数据作为资源暴露 | ✔️ | 需编写自定义 @RestResource 插件。JSON:API 仅支持实体。 | |
获取单个资源 | ✔️ | ✔️ | |
获取资源列表 | ✔️ | 部分支持 |
REST:需要配置一个视图(View),并设置“REST export”显示。 |
资源列表分页 | ✔️ | 需要额外模块(例如 Pager Serializer)。 | REST:不原生支持!REST export 视图会返回全部资源。 |
资源列表过滤 | ✔️ | 部分支持 |
REST:只有当你为每个字段及每一种可能的运算符都创建了公开过滤器(exposed filter)时才可行。 |
资源排序 | ✔️ | ||
包含/嵌入(includes/embedding) | ✔️ | 仅 HAL+JSON 支持 | |
不对字段值进行不必要的包装 | ✔️ | HAL 规范化与默认规范化(因此所有格式)都会暴露 Drupal 在内存中的 PHP 数据结构,给消费方带来不佳的开发体验(DX)。JSON:API 简化了单基数、单属性字段的规范化。 | |
可省略消费者不需要的字段 | ✔️ | ||
一致的 URL | ✔️ | ||
客户端可发现可用的资源类型 | ✔️ | ||
与 Drupal 无关的响应结构 | ✔️ | REST:理论上 HAL 规范化不含 Drupal 特性,但实践中并非如此。 | |
客户端库 | ✔️ | ||
可扩展规范 | WIP | ||
零配置 | ✔️ | REST:每个 @RestResource 插件定义都可以被暴露,但必须配置后才会被暴露。你需要为每一项选择允许的格式、允许的认证提供者,必要时还要选择允许的 HTTP 方法。 JSON:API:所有实体自动暴露;遵循实体/字段访问控制;所有已安装的认证提供者都会自动被允许。 |
更多信息
参阅将 JSON:API 模块加入 Drupal 核心的理由以及模块架构的设计理由。
文章来自 Drupal 文档。