建模 URI 以演示 2 API 资源之间的多对多关系

Modelling URI to demonstrate many to many relationship between 2 API resources

一个信用卡账户(Account)可以属于多个客户,一个客户(Customer)可以拥有多个信用卡账户。我需要设计 REST API(s),它可以 return 客户拥有的所有帐户。帐号来自最终用户(例如服务代表)在自由格式文本框中的手动输入。以下是一个约束

  1. 结束 consumers/developers 只知道帐号,不知道客户 ID(客户的唯一标识符),以便检索列表属于客户的帐户 -

    1.1 找到拥有相关帐户的客户

    1.2 然后找到一个客户拥有的所有账户。

我可以想到几个选项,但我觉得它们要么会使交互变得更健谈,要么可能不会 restful。

以下选项仅讨论了 GET 场景

选项 1

理想 与两个独立资源进行交互的方式,但使交互非常繁琐,并且会给系统带来过度的负载。每次打两个电话,了解客户拥有的所有帐户。所以 SOAP/RPC 中的 2000 万 calls/day 将变成 REST 中的 4000 万次调用。

/accounts/{account_nbr}/customers --> returns a list of customers for a specific account
/customers/{customer_id}/accounts --> returns a list of accounts for a customer

选项 2

我认为这不会是 restful 因为查询参数应该用于 识别 非分层数据中的资源

/customers/accounts?account_nbr = XXXX

选项 3

此选项表示链接到 account_nbr 的帐户列表正在 returned 这是不正确的,因为帐户列表链接到客户

/accounts/{account_nbr}/linked_accounts

选项 4

将客户与帐户之间的关系称为一种新型资源。它试图指示获取客户与帐户关系的列表,并确定 customer_account_relationships 中帐户的值为 XXXX 的特定实例。 /customer_account_relationships?account_nbr=XXXX 或

以上哪个选项(如果有的话)接近restful表示?这个界面还有其他设计方法吗?

编辑

预期响应

{
  "customerName" : "Bob",
  "customerId" : 1234,
  "listOfAccounts": [
          {
             "accountNbr" : "abcd"
             "accountType": "creditcard"
          },
          {
             "accountNbr" : "qrst"
             "accountType": "creditcard"
          }
     ]
 }                             

您正确地拒绝了前三个选项。我为您看到两个合理的选择。一种是选择选项 4:

GET /customer-summaries?account-number=<account-number>

另一种是使 /accounts 成为顶级并做基本相同的事情:

GET /accounts?same-owner-as-account=<account-number>

在前一种情况下,您会在上面获得资源的一个实例。在第二个中,您只会得到一个帐户列表,每个帐户可能都有一个 link 给帐户所有者。哪个更适合您的用例取决于您。

请注意,如果同一帐户有多个所有者,则选项 4 可能 return 多条记录。这是已婚夫妇的常见情况。