如何通过REST API获取数据时处理实体关系?

时间:2017-12-05 08:30:45

标签: java rest spring-rest

假设您在典型的Java Web应用程序中有一个实体User。例如。 Spring框架,Hibernate ORM等等User有一些关系,例如:

public class User {
    // primitive fields
    private Team team;
    private Set<Group>;
    // ...
}

您可以轻松浏览用户的图表,例如user.getTeam().getName()

通过REST API公开此类实体并从Java客户端访问它们的最佳做法是什么?

E.g。当我需要通过id加载用户时。我是否应该收到包含teamgroups的回复?如果每次获取用户时我都不需要这些关系,那该怎么办呢?

问题更多的是关于设计Java客户端。

2 个答案:

答案 0 :(得分:0)

在我看来,这取决于Team对象的大小和用法。如果它非常小或者在您需要用户时始终需要,您可以在致电User时将其直接附加到Get /users/{id}。否则,Team将获得Get /users/{id}/team

最佳做法是HATEOAS。对Get /users/{id}的调用将返回一个用户json对象,该对象还通过将路径(Get /users/{id}/team)包含在其中来指示团队属性。但是,由于这是一项很多工作,人们可能不会采取额外措施。

答案 1 :(得分:0)

您可以使用GraphQL。此API查询语言允许客户端仅查询实体中的特定字段。

例如,在您的情况下,客户端会进行以下查询以加载团队:

{
  user {
    team
  }
}

如果客户端只需要用户名,则可以是查询:

{
  user {
    name
  }
}

您可以找到Java实现here