我一直在尝试用springboot启动restapi,但我有点纠结于我的资源和哪个端点应该在哪个文件中的分离。假设我们有一个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);
}
}
到目前为止还不错,很简单。当我必须从一个用户那里获得所有的成就时,我的问题就来了。命名covention说我应该有一个端点,比如: /user/{id}/achievements GET
但是这个端点应该在哪里呢?我觉得这两个资源都是好的,因为对于userresource,端点的根是用户,但是aclementResource也可以是逻辑的,因为我们正在返回成就。
2条答案
按热度按时间58wvjzkj1#
简单回答:你的问题错了
但是这个端点应该在哪里呢?
资源的定义应该在机器可读的api定义中。通过将定义输入代码生成器以供选择语言,可以生成所需的类文件。生成器将把它创建的类放在文件中的某个地方,然后您将它们保留在这个默认的排列方式中,直到将来某个时候您有一个令人信服的理由对它们进行不同的排列(此时,您将分叉代码生成器,并将您首选的设计作为默认设计)。
也就是说,在手工设计时,“rest端点”并没有什么特别之处。关于资源类所属位置的指导原则与java中的任何其他类没有区别。。。。
也就是说,我发现文献中围绕文件布局的启发式方法相当令人失望。似乎没有太多的材料讨论不同设计的权衡,或者一种选择可能比另一种更有说服力的背景。
对于您的具体情况,我建议将新资源放入自己的文件中。这里的论点是,您的userresource具有用户依赖性,而您的achievementsresource具有成就依赖性,但是您的新事物两者都具有,并且作为(hand waves)原则,我们应该避免将不需要的成就依赖性引入userresource的命名空间(反之亦然)。
换句话说,如果我们发现自己将导入添加到现有文件以实现一个新事物,那么这就意味着新事物可能会更好地放在其他地方。
使用单独的文件也有很好的机械优势-它减少了合并冲突,每个文件都有自己的源代码管理历史记录(这意味着用户的历史记录不会被一堆专门针对新事物的提交所混乱)。例如,在codescene上可以看到adam tornhill的作品。
jxct1oxe2#
当你把控制器分开时,这并没有错,你应该按照它们的一般实体对方法进行分类,“如果我需要恢复用户的成就”,这两者都是相关的,但是,她从哪里得到这些数据呢?对于知道每个成就必须在数据库中与用户有关系的成就,您可以使用list returnachievementsbyuser(integer id)方法在成就控制器中很好地查找它。