多对多 JSON API URI 命名

Many-to-Many JSON API URI naming

我想知道以下命名约定是否正确符合 JSON API 标准,因为在我能找到的任何地方都没有具体提及。

给定账户和产品之间的多对多关系,账户-产品资源存储两者之间的数据透视表。

我想知道如何处理 /api/v1/accounts/1/products 关系资源

账户 > 账户-产品 > 产品

网址:

/api/v1/accounts:returns 账户资源

/api/v1/account-products: returns account-product resources

/api/v1/accounts/1/products:returns account-product resources

/api/v1/accounts/1/products: return 产品 与帐户相关的资源


这里的两个论点是:

选项 1:account/1/products 应该 return 帐户和产品之间的 link 因为它本质上应该充当 ID 本质上应该充当连字符,例如account/1/products 真正的意思是账户产品。

选项 2:account/1/products 应该 returns 与账户相关的产品,并且还包括账户-产品资源作为强制关系,因为 URI 中的资源是产品,而不是账户-产品

JSON:API 规范与 URL 设计无关。因此,这主要取决于这些 URL 的使用位置。但是 JSON:API 规范附带了一些 recommendations on URL design. I assume that you follow that ones. Especially that /api/v1/accounts/1/products is used as related resource link,例如

{
  "type": "accouts",
  "id": "1",
  "relationships": {
    "products": {
      "links": {
        "related": "/api/v1/accounts/1/products"
      }
    }
  }
}

在那种情况下,规范非常清楚应该 returned:

Related Resource Links

A “related resource link” provides access to resource objects linked in a relationship. When fetched, the related resource object(s) are returned as the response’s primary data.

For example, an article’s comments relationship could specify a link that returns a collection of comment resource objects when retrieved through a GET request.

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

根据您描述数据结构的方式,一个 account 有多个 account-products,属于一个 product。所以它应该 return 相关 account-products。您可以默认包含它们所属的 products

可能会让您感到困惑的是中间关系的概念,例如某些 ORM(例如 Eloquent)中的 "Has One Through"。命名 account-products 表明这可能就是这样的一个例子。 JSON:API 规范不支持类似的东西。中间关系应该使用普通资源类型建模。因此,在您的情况下 account-products 将是正常的资源类型,例如 accountsproducts.