REST API:POSTing客户端应该如何了解关联的ID?

时间:2018-05-29 21:28:42

标签: rest api-design json-api

我正在更新RESTful API并且它已经在使用JSON API。

我想启用/quotes的POST,但引号需要product

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

以下是一些想法;我欢迎其他人。

  1. 要求客户首先获取/products,在返回的列表中找到所需的产品,然后发送相关产品的id
  2. 标准化一些永不改变的公共代码列表,以便客户端可以简单地相信代码是可靠的。例如。如果产品是来自Acme的产品1,则代码可以是"acme_1"等。
  3. 对于选项2,代码可以作为attributerelationship发送。也就是说,我们可以做到

    // 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"
      }
    }
    

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

1 个答案:

答案 0 :(得分:0)

如果quoteproduct之间存在一对多关系,则应在您的有效负载中反映出来。关系必须位于资源对象的relationships键中。 resource linkage必须位于data的{​​{1}}密钥下。因此,显示为2a和2b的两个选项都不符合规范。创建具有关系的资源的有效负载如下所示:

relationships object

请注意,该示例显示了一对一关系的关系对象。如果帐户可以包含许多产品 { "data": { "type": "accounts", "attributes": { "foo": "bar" } relationships: { "product": { "data": { "type": "products", "id": "acme_1" } } } } } 属性 关系对象必须是一个数组:

data

从JSON API规范的角度来看,客户端如何知道要关联的ID并不重要。 { "data": { "type": "accounts", "attributes": { "foo": "bar" } relationships: { "product": { "data": [ { "type": "products", "id": "acme_1" }, { "type": "products", "id": "acme_2" }, ] } } } } id必须是字符串的spec only statestypeid"的组合必须标识单个唯一资源"。

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