REST API design- handling foreign key references and different representations of the same resource
REST API design- handling foreign key references and different representations of the same resource
在创建 API 时,我常常不确定我的数据库中引用值的处理方式以及同一资源的不同表示形式。
假设我有一个订单 table,其中包含以下字段:id、product_id(fk) status_id(fk).
现在,对这个订单发出 GET 请求:
GET /api/order/{order_id}.
由于我的经验不足,现在出现两个问题:
1. return 对引用其他资源(产品)或查找 table(状态)的字段做什么?
我正在考虑的选项是:
a) 只提供fk id,交给客户端去请求对应的资源
GET /api/order/1
{
id: 1,
status_id: 1,
}
b) 提供 ID 以及响应中可能相关的值。例如。响应将包括:
GET /api/order/1
{
id: 1,
status_id: 1,
status_title: 'pending,
}
c) 在后端做两个查询,并将它们嵌套在响应中:
GET /api/order/1
{
id: 1,
status: {
id: 1,
title: 'pending',
},
}
2。您如何处理来自不同利益相关者的资源请求?
例如当然,收到订单的客户不应该(也可能不想)访问该资源的相同表示,就像商店管理员使用他的界面来完成订单一样。
假设,理论上,订单 table 包含一个字段 commission_rate,说明
内部就该订单协商了相关佣金。
你现在如何处理前面提到的 GET 以表明你正试图从某个角度检索它?
也许
获取/api/order/{id}/客户
或
获取 /api/order/{1}?view=客户
API倾向于在域级别工作:
Order {
id: "123",
customerId: "456"
...
}
数据库在实施层面工作:
带有 FK 等的行。没有客户需要知道 FK 的含义,甚至不需要看到一个。
因此,从域的角度开始设计 API,然后将端点分组到授权上下文中,例如只有销售代表可以申请 commission_rate
订单。
域对象本身是“第一个 class 公民”,Order
、Product
、Sales
等并且授权上下文确定 who/what 可以请求每个域对象(REST 资源)。
例如Customer
可能想知道他们的 Order
什么时候被 Deliver
编辑,而 SalesRep
可能想知道 Order
什么时候 Customer
已交付,以便他们可以拿到 CommissionRate
.
GET /order/{id} -> Order accessed by (Custmer, SalesRep, Admin)
GET /order/{id}/status -> OrderStatus accessed by (Custmer, SalesRep, Admin)
GET /order/{id}/commission -> CommissionRate accessed by (SalesRep, Admin)
在每次通话中,客户都想了解 Order
的特定方面。在包含其他内容方面,他们可能不想要它,但您可以在响应中包含相关链接作为 HATEOS 扩展,提供与 Order
相关的相关 API 端点,例如 Product
命令,甚至 API 端点得到 Status
等等
在创建 API 时,我常常不确定我的数据库中引用值的处理方式以及同一资源的不同表示形式。
假设我有一个订单 table,其中包含以下字段:id、product_id(fk) status_id(fk).
现在,对这个订单发出 GET 请求:
GET /api/order/{order_id}.
由于我的经验不足,现在出现两个问题:
1. return 对引用其他资源(产品)或查找 table(状态)的字段做什么?
我正在考虑的选项是:
a) 只提供fk id,交给客户端去请求对应的资源
GET /api/order/1
{
id: 1,
status_id: 1,
}
b) 提供 ID 以及响应中可能相关的值。例如。响应将包括:
GET /api/order/1
{
id: 1,
status_id: 1,
status_title: 'pending,
}
c) 在后端做两个查询,并将它们嵌套在响应中:
GET /api/order/1
{
id: 1,
status: {
id: 1,
title: 'pending',
},
}
2。您如何处理来自不同利益相关者的资源请求?
例如当然,收到订单的客户不应该(也可能不想)访问该资源的相同表示,就像商店管理员使用他的界面来完成订单一样。
假设,理论上,订单 table 包含一个字段 commission_rate,说明 内部就该订单协商了相关佣金。
你现在如何处理前面提到的 GET 以表明你正试图从某个角度检索它?
也许
获取/api/order/{id}/客户
或
获取 /api/order/{1}?view=客户
API倾向于在域级别工作:
Order {
id: "123",
customerId: "456"
...
}
数据库在实施层面工作:
带有 FK 等的行。没有客户需要知道 FK 的含义,甚至不需要看到一个。
因此,从域的角度开始设计 API,然后将端点分组到授权上下文中,例如只有销售代表可以申请 commission_rate
订单。
域对象本身是“第一个 class 公民”,Order
、Product
、Sales
等并且授权上下文确定 who/what 可以请求每个域对象(REST 资源)。
例如Customer
可能想知道他们的 Order
什么时候被 Deliver
编辑,而 SalesRep
可能想知道 Order
什么时候 Customer
已交付,以便他们可以拿到 CommissionRate
.
GET /order/{id} -> Order accessed by (Custmer, SalesRep, Admin)
GET /order/{id}/status -> OrderStatus accessed by (Custmer, SalesRep, Admin)
GET /order/{id}/commission -> CommissionRate accessed by (SalesRep, Admin)
在每次通话中,客户都想了解 Order
的特定方面。在包含其他内容方面,他们可能不想要它,但您可以在响应中包含相关链接作为 HATEOS 扩展,提供与 Order
相关的相关 API 端点,例如 Product
命令,甚至 API 端点得到 Status
等等