复杂 JSON API 属性上的稀疏字段

Sparse fields on complex JSON API attributes

根据 #document-resource-object-attributes 允许属性具有 'complex' 值,即任何有效的 JSON 值。

使用 #fetching-sparse-fieldsets 可以 select 内容的子集。但是,所有示例都匹配属性名称。

例如:

{
  "data": [
    {
      "type": "dogs",
      "id": "3f02e",
      "attributes": {
        "name": "doggy",
        "body": {
          "head": "small",
          "legs": [
            {
              "position": "front",
              "side": "right"
            },
            {
              "position": "front",
              "side": "left"
            }
          ],
          "fur": {
            "color": "brown"
          }
        }
      }
    }
  ]

结果我只对namebody.headbody.fur.color感兴趣。

解决这个问题的正确方法是什么(最好不需要关系,因为这个数据是有效的)?

JSON:API 的稀疏字段集功能允许仅请求资源的特定字段:

A client MAY request that an endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] parameter.

https://jsonapi.org/format/#fetching-sparse-fieldsets

字段是 JSON:API 中的属性或关系:

A resource object’s attributes and its relationships are collectively called its “fields”.

https://jsonapi.org/format/#document-resource-object-fields

稀疏字段集并不意味着对属性或关系的值产生影响。如果您有这样的需求,您不应将数据建模为复杂值,而应将其作为单独的资源公开。

请注意,您的数据库模式和 API 公开的资源不需要相同。实际上,在您的 JSON:API.

中,数据库表和资源之间没有一对一的关系通常是有意义的

不要害怕拥有多种资源。从长远来看,这通常比拥有一个包含复杂对象的资源要好得多:

  • 您可以默认包含相关资源(例如 dog-bodiesdog-legsdog-furs)。
  • 您可以根据父资源的持久 ID 自动生成该资源的 ID。
  • 如果有单独的资源,您可以有更严格的约束和更简单的文档 API。
  • 您可以降低冲突的风险,因为您可以支持更新特定部分(例如 dog-furscolor 属性)而不是替换 [=] 的完整 body 值16=]资源。

我目前看到的拥有多个资源而不是一个资源的主要缺点是您无法在使用 JSON:API v1.0 的同一请求中创建或更新多个资源的限制。但很可能即将推出的 v1.1 将不再有该限制。一个名为 Atomic Operations 的官方现有系统由从事规范工作的核心团队成员针对该用例提出。