首页 > 解决方案 > REST API:POSTing 客户端应该如何了解关联的 id?

问题描述

我正在更新一个 RESTful API,它已经在使用 JSON API。

我想启用 POST 到/quotes,但引号必须要有product.

我的问题是:客户应该如何了解和识别应该与报价相关联的产品?

这里有一些想法;我欢迎其他人。

  1. 要求客户端先GET /products,在返回的列表中找到想要的产品,然后发送有id问题的产品。
  2. 标准化一些永远不会改变的公共代码列表,以便客户可以简单地相信代码是可靠的。例如,如果产品是 Acme 的产品 1,则代码可以是"acme_1"等。

至于选项 2,代码既可以作为 anattribute也可以作为relationship. 也就是说,我们可以做

// option 2a
"data": {
  "type": "accounts",
  "attributes": {
    "foo": "bar",
    "product_code": "acme_1"
  }
}

// option 2b
"data": {
  "type": "accounts",
  "attributes": {
    "foo": "bar"
  }
  relationships: {
    "type": "products",
    "id": "acme_1"
  }
}

请发送想法、建议和/或阅读建议!

标签: restapi-designjson-api

解决方案


如果您之间有一对多的关系quoteproduct这应该反映在您的有效负载中。关系必须是relationships资源对象的键。Aresource linkage必须在dataa 的键下relationships object。因此,您作为 2a 和 2b 提供的两个选项都不符合规范。创建具有关系的资源的有效负载如下所示:

{
  "data": {
    "type": "accounts",
    "attributes": {
      "foo": "bar"
    }
    relationships: {
      "product": {
        "data": {
          "type": "products",
          "id": "acme_1"
        }
      }
    }
  }
}

请注意,该示例显示了一对一关系的关系对象。如果一个帐户可以有许多关系对象的产品 data属性必须是一个数组:

{
  "data": {
    "type": "accounts",
    "attributes": {
      "foo": "bar"
    }
    relationships: {
      "product": {
        "data": [
          {
            "type": "products",
            "id": "acme_1"
          },
          {
            "type": "products",
            "id": "acme_2"
          },
        ]
      }
    }
  }
}

从 JSON API 规范的角度来看,客户端如何知道要关联哪个 ID 并不重要。该规范仅声明anid必须是一个字符串,并且 and 的组合typeid必须标识一个单一的、唯一的资源”。

当然,客户端必须知道哪个资源应该与创建的资源相关联。如何实现它完全取决于应用程序。它可以被硬编码或从后端获取。出于可扩展性和可维护性的原因,如果它有可能定期更改,我建议不要对其进行硬编码。但从 JSON API 规范的角度来看,只有引用的相关资源存在时才重要。否则服务器必须返回一个404 Not Found.


推荐阅读