在单个请求中 post 多个相关实体的正确 JSONAPI 方法是什么?

What is the correct JSONAPI way to post multiple related entities in a single request?

在我假设的应用程序的某个时刻,为了提高效率,我想在单个请求中创建多个不同类型的相关实体。在下面的示例中,我以包含有关新用户及其相关头像的数据的方式序列化请求。

// POST /api/users
{
    data: {
        attributes: { ... },
        type: 'user',
        relationships: {
            avatar: {
                data: {
                    attributes: { ... }
                    type: 'avatar',
                }
            }
        }
    }
}

问题是,在 JSONAPI 中 correct/recommended 方法(如果有的话)是什么?

JSON:API 规范尚不​​支持在单个请求中创建或更新多个资源。但是,有人提议 Atomic Operations extension 即将发布的 v1.1 规范。

但在大多数情况下,这样的功能并不是效率所必需的。您甚至可能通过将多个创建或更新请求捆绑为一个请求来增加服务器的负载。现在 HTTP/2 并行执行多个请求很便宜。

如果操作相互依赖(例如,必须等待一个 post 被创建,然后才能为这个 post 创建一个评论,那么它可能没有一个请求那么高效).但在那种情况下,原子事务也是一个强烈的要求。这是该扩展背后的主要驱动力。

所以回答你的问题:

  • JSON:API 规范目前不支持它。
  • 很有可能在下一个版本 (v1.1) 中通过扩展支持它。
  • 如果效率是您寻找此类功能的唯一原因,那么您可能根本不需要它。

由于这很常见,因此多次鼓励将 REST API 资源与内部表示分离,因此没有建议反对定义特定的 'virtual' 端点,其中该资源又将成为不同端点下两个或多个不同资源的属性。

它可能无法解决您的问题,如果您一般需要这样的功能,但如果仅某些资源组合需要此功能,您始终可以为包含所有相关资源的所有属性的资源创建一个专用端点。

在你的情况下可能是这样的:

// POST /api/users_with_avatar
{
  data: {
    attributes: {
      "user_attribute_1": "...",
      "user_attribute_2": "...",
      "user_attribute_3": "...",
      "avatar_attribute_1": "...",
      "avatar_attribute_2": "..."
    },
    type: 'user-with-avatar'
  }
}