rest - REST API:POSTing 客户端应该如何了解关联的 id?
问题描述
我正在更新一个 RESTful API,它已经在使用 JSON API。
我想启用 POST 到/quotes
,但引号必须要有product
.
我的问题是:客户应该如何了解和识别应该与报价相关联的产品?
这里有一些想法;我欢迎其他人。
- 要求客户端先GET
/products
,在返回的列表中找到想要的产品,然后发送有id
问题的产品。 - 标准化一些永远不会改变的公共代码列表,以便客户可以简单地相信代码是可靠的。例如,如果产品是 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"
}
}
请发送想法、建议和/或阅读建议!
解决方案
如果您之间有一对多的关系quote
,product
这应该反映在您的有效负载中。关系必须是relationships
资源对象的键。Aresource linkage
必须在data
a 的键下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 的组合type
“id
必须标识一个单一的、唯一的资源”。
当然,客户端必须知道哪个资源应该与创建的资源相关联。如何实现它完全取决于应用程序。它可以被硬编码或从后端获取。出于可扩展性和可维护性的原因,如果它有可能定期更改,我建议不要对其进行硬编码。但从 JSON API 规范的角度来看,只有引用的相关资源存在时才重要。否则服务器必须返回一个404 Not Found
.
推荐阅读
- android - 如何使用 MediaColumns#IS_PENDING 将 Base64 编码的图像保存到图库
- doctrine-orm - 月代中的学说2实体编号
- python - 将列表拆分为 X 个大小均匀的块?
- python - 概率不加到 1
- spring - Spring自定义过滤器在过滤器链中一个接一个
- python - Jupyter notebook 魔术命令 - 使用 %who DataFrame 获取 DataFrame 列表?
- javascript - 输出未以简单的奇/偶码显示
- php - 使用属性访问 PHP SoapClient 响应元素中的值
- docker - 在后台运行 Docker 命令?
- apache-spark - Hive 可以从 Delta Lake 文件格式读取数据吗?