RESTAPI设计:在哪里创建依赖于其他资源的资源?

RESTAPI设计:在哪里创建依赖于其他资源的资源?,rest,restful-architecture,hateoas,Rest,Restful Architecture,Hateoas,如果我有两个资源,其中一个是从另一个创建的,那么我应该将创建端点放在哪里 例如: 我有两个资源,A和B,我想创建一个B B是一个简单的类,它引用a和创建它的用户,如下所示 public class B { private A a; private User user; } 用户信息是通过HTTP请求隐式发送的,因此我不需要任何参数 解决方案1: 将不带任何参数的帖子发送到/a/123/B并返回B。这意味着A的控制器负责创建B。感觉很奇怪 解决方案2: 将id为123的帖子发送到

如果我有两个资源,其中一个是从另一个创建的,那么我应该将创建端点放在哪里

例如:

我有两个资源,A和B,我想创建一个B

B是一个简单的类,它引用a和创建它的用户,如下所示

public class B {
    private A a;
    private User user;
}
用户信息是通过HTTP请求隐式发送的,因此我不需要任何参数

解决方案1:

将不带任何参数的帖子发送到
/a/123/B
并返回
B
。这意味着A的控制器负责创建B。感觉很奇怪

解决方案2:

将id为123的帖子发送到
/B
。这意味着如果存在id为123的A,我必须在控制器中检查B。感觉也很奇怪


两种解决方案的优缺点是什么?我是否过度考虑了API设计?

您需要清楚依赖性

A是由B组成的吗?换句话说,B是否存在于范围之外

  • 如果答案是肯定的,B可以在没有A的情况下存活,最好有一个单独的资源:

    POST ./B
    
  • 您应该避免将资源放置在不同的位置路径。有些人可能会争辩说REST并没有强迫您为一个资源使用一个端点,但保持跨不同端点的一致性并不明显。如果发送
    DELETE./a/{id}
    ,则
    B
    会发生什么情况

  • 如果响应为否,这意味着除非A存在,否则B不可能存在,那么最好将B作为子资源

    POST ./A/{id}/B
    

  • 说到控制器,没有什么能强迫你从另一个控制器管理B。REST的全部要点是,调用不是控制器的地址,而是资源的地址。您正在创建的资源独立于控制器。

    感谢您清晰明了的解释!