【问题标题】:Sparse fields on complex JSON API attributes复杂 JSON API 属性上的稀疏字段
【发布时间】:2020-06-12 08:40:27
【问题描述】:

根据#document-resource-object-attributes,允许属性具有“复杂”值,即任何有效的 JSON 值。

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

例如:

{
  "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 crnk


    【解决方案1】:

    JSON:API 的 Sparse Fieldsets 功能允许仅请求资源的特定字段:

    客户端可以通过包含 fields[TYPE] 参数来请求端点在每种类型的基础上仅返回响应中的特定字段。

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

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

    资源对象的属性及其关系统称为其“字段”。

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

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

    请注意,您的数据库架构和您的 API 公开的资源无需相同。实际上,在 JSON:API 中的数据库表和资源之间不存在一对一关系通常是有意义的。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      相关资源
      最近更新 更多