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

REST API: how should a POSTing client learn about associated ids?

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

我想启用 /quotes 的 POST,但引号必须有 product

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

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

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

至于选项 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"
  }
}

请发送想法、建议、and/or阅读建议!

如果您在 quoteproduct 之间存在一对多关系,这应该反映在您的负载中。关系必须在 relationships key of a resource object. A resource linkage 中,必须在 relationships objectdata 键下。因此,您提供的两个选项 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 并不重要。 spec only states 一个 id 必须是一个字符串并且 typeid 的组合 "must identify a single, unique resource".

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