REST API 设计:在哪里创建依赖于其他资源的资源?
REST API Design: Where to create Resource that depends from other resource?
如果我有两个资源,其中一个是从另一个创建的,我应该将创建端点放在哪里?
示例:
我有两个资源,A 和 B,我想创建一个 B。
B 是一个简单的 class,它引用 A 和创建它的用户,就像这样
public class B {
private A a;
private User user;
}
用户信息是通过 HTTP 请求隐式发送的,因此我不需要任何参数。
解决方案一:
向/A/123/B
和returnB
发送不带任何参数的POST。这意味着A的Controller负责创建B。感觉很奇怪。
方案二:
发送一个 ID 为 123 的 POST 到 /B
。这意味着如果存在 ID 为 123 的 A,我必须检查 B 的控制器。感觉也奇怪。
两种解决方案的优缺点是什么?我是不是想多了 API 设计?
你需要清楚依赖性
A是由B组成的吗?换句话说,B 是否存在于 A 范围之外?
如果答案是肯定的,B可以没有A活着,最好有一个单独的资源:
POST ./B
您应该避免将资源放置在不同的位置路径中。有些人可能会争辩说,REST 不会强制您为一种资源使用单个端点,但保持跨不同端点的一致性并不是那么明显。如果您发送 DELETE ./A/{id}
,B
会怎样?
如果回答是否定的,意味着B不存在,除非A存在,那么最好将B作为子资源。
POST ./A/{id}/B
说到控制器,没有什么可以迫使您从其他控制器管理 B。 REST 的全部要点是调用不是指向控制器而是指向资源。您正在创建的资源独立于控制器。
如果我有两个资源,其中一个是从另一个创建的,我应该将创建端点放在哪里?
示例:
我有两个资源,A 和 B,我想创建一个 B。
B 是一个简单的 class,它引用 A 和创建它的用户,就像这样
public class B {
private A a;
private User user;
}
用户信息是通过 HTTP 请求隐式发送的,因此我不需要任何参数。
解决方案一:
向/A/123/B
和returnB
发送不带任何参数的POST。这意味着A的Controller负责创建B。感觉很奇怪。
方案二:
发送一个 ID 为 123 的 POST 到 /B
。这意味着如果存在 ID 为 123 的 A,我必须检查 B 的控制器。感觉也奇怪。
两种解决方案的优缺点是什么?我是不是想多了 API 设计?
你需要清楚依赖性
A是由B组成的吗?换句话说,B 是否存在于 A 范围之外?
如果答案是肯定的,B可以没有A活着,最好有一个单独的资源:
POST ./B
您应该避免将资源放置在不同的位置路径中。有些人可能会争辩说,REST 不会强制您为一种资源使用单个端点,但保持跨不同端点的一致性并不是那么明显。如果您发送 DELETE ./A/{id}
,B
会怎样?
如果回答是否定的,意味着B不存在,除非A存在,那么最好将B作为子资源。
POST ./A/{id}/B
说到控制器,没有什么可以迫使您从其他控制器管理 B。 REST 的全部要点是调用不是指向控制器而是指向资源。您正在创建的资源独立于控制器。