【发布时间】:2021-04-23 00:52:53
【问题描述】:
我一直在尝试使用 Spring Boot 启动一个 REST api,但我对资源的分离以及哪个端点应该在哪个文件中有点挣扎。 假设我们有一个 api enpoint 来处理用户和该用户的成就:
/user/{id} GET - 通过 id 获取用户
/achievement/{id} GET - 按成就获取
它们都在各自的资源文件中:
用户资源
@RestController
public class UserResource {
public UserResource() {...}
@GetMapping("/users/{id}")
public UserDTO getUser(String id) {
log.debug("REST request to get User : {}", login);
return userService.getUserWithAuthoritiesById(id).map(AdminUserDTO::new));
}
和成就资源
@RestController
public class AchievementResource {
public AchievementResource(...) {...}
@GetMapping("/achievements/{id}")
public ResponseEntity<Achievement> getAchievement(@PathVariable Long id) {
return achievementRepository.findById(id);
}
}
到目前为止一切顺利,非常简单。当我必须从用户那里获得所有成就时,我的问题就来了。命名约定说我应该有一个端点,例如:
/user/{id}/achievements GET
但是这个端点应该在哪里呢?我觉得这两个资源都可能很好,因为对于 UserResource,端点的根是用户,但由于我们正在返回成就,AchievementResource 也可能是合乎逻辑的。
【问题讨论】:
-
在尝试分离控制器时,确定特定请求所引用的对象非常重要。在您的情况下,您正在寻找特定用户的所有成就。如果是这种情况,我会将这个端点放在 UserResource 类中。如果要查找所有具有特定成就的用户,则该端点会更适合AchievementResource 类。
标签: java spring-boot rest endpoint