相对于父级

时间:2019-05-21 07:41:52

标签: json rest json-api

当对资源关系进行建模时,给出的经典示例是针对articlescomments的。建模起来很简单,因为:

  • 文章可以唯一标识:/ articles / 1
  • 评论可以唯一标识:/ comments / 2
  • 他们的关系可以作为/ articles / 1 / comments提供,该评论将仅返回该文章的评论

但是如何处理相关资源仅存在于父级上下文中的情况?

例如orderitems

  • 订单可以唯一标识/ orders / 123
  • 该订单中的商品仅以/ orders / 123 / items
  • 的形式存在
  • 而不是/ items

在JSON-API中,关系对象需要一个“类型”和“ id”来指定链接:

"relationships": {
    "links": {
        "self": "http://example.com/orders/123/relationships/items",
        "related": "http://example.com/orders/123/items"
    },
    "data": {
        "type": <what goes here>,
        "id": <what goes here>
    }
}

数据的类型和ID必须与订单号123相关。当然,假设它们实际上不是一个复合键,因此不会从数据库中分配给它们UUID或类似物。它们主要作为外键组合存在。

如何处理?

该关系的一个选项是将type用作order_item,将id用作订单ID和商品ID的散列或分隔字符串的字符串。 (例如123_abc)。 123我从订单中得到,abc从订单中得到。

除了完全避免提供资源链接之外,还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

每个资源都必须根据JSON API规范由typeid组合唯一标识:

  

标识

     

每个资源对象必须包含一个id成员和一个type成员。 id和type成员的值必须为字符串。

     

在给定的API中,每个资源对象的类型和ID对必须标识一个唯一的资源。 (由一台或多台服务器控制的一组URI构成一个API。)

     

https://jsonapi.org/format/#document-resource-object-identification

因此,您不仅需要resource linkage的ID,而且还需要建立任何有效的响应,包括此类资源。

但是没有关于如何为每种类型生成唯一ID的规则。如果您的数据模型不包含ID,则将唯一的订单ID与唯一的商品ID组合在一起以获取订单中每个商品的唯一ID似乎是一种好方法。