0

根据#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"
          }
        }
      }
    }
  ]

结果我只对name,body.head和感兴趣body.fur.color

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

4

1 回答 1

0

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

客户端可以通过包含 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 设置更严格的限制和更简单的文档。
  • 您可以降低发生冲突的风险,因为您可以支持更新特定部分(例如colora 的属性dog-furs)而不是替换资源的全部bodydogs

我目前看到的拥有多个资源而不是一个资源的主要缺点是您无法使用 JSON:API 在同一个请求中创建或更新多个资源的限制v1.0。但很可能即将到来的v1.1将不再有这种限制。负责该规范的核心团队成员为该用例提议了一个名为原子操作的官方现有项目。

于 2020-03-08T14:28:21.157 回答