gpt4 book ai didi

java - Spring PUT-Request,最好的方法

转载 作者:行者123 更新时间:2023-12-02 09:22:18 26 4
gpt4 key购买 nike

所以我知道,在 REST 中,通常当我执行 PUT 请求时,我应该在 URL 中指定我想要更新的资源,例如:.../collections/{collectionId}

在 Spring Boot 中为我的角色资源实现该功能将如下所示:

@RepositoryRestController
@RequestMapping("/roles")
public class RoleController {

private RoleRepository roleRepository;

@Autowired
public RoleController(RoleRepository roleRepository) {
this.roleRepository = roleRepository;
}

@PutMapping("/{roleId}")
public @ResponseBody ResponseEntity<Role> putRole(@PathVariable long roleId, @RequestBody Role newRole) {
Optional<Role> roleOptional = this.roleRepository.findById(roleId);
if(roleOptional.isPresent()) {
Role roleToBeSaved = roleOptional.get();
roleToBeSaved.name = newRole.name;
roleToBeSaved.description = newRole.description;
// set more attribute
this.roleRepository.save(roleToBeSaved);
return ResponseEntity.ok(roleToBeSaved);
}
throw new RoleNotFoundException('could not find role with id + ' + roleId);
}
}

但这不是比需要的工作更多吗,因为 RequestBody 中的 newRole 已经包含了 id,所以我可以这样做:

@PutMapping("/{roleId}")
public @ResponseBody ResponseEntity<Role> putRole(@PathVariable long roleId, @RequestBody Role newRole) {
this.roleRepository.save(newRole);
return ResponseEntity.ok(newRole);
}

这会导致未使用的 PathVariable,但我不需要它,因为 newRole 已包含 ID。那么执行这样的 PUT 请求的最佳方法是什么?

编辑:显然,我可以将 URL 更改为 .../roles/role 之类的内容,而无需使用 PathVariable,只需在 RequestBody 中发送 newRole 即可。但这不是 PUT 请求 URL 通常应该的样子,对吗?

最佳答案

看看this邮政。Restful Api 应该是 self 解释的,而不是保存每个可能的字节。Restful Api 遵循声明你想要做什么的原则。在您的示例中,您想要更新角色。角色包含 id 和角色名称。路径变量描述资源的唯一路径,请求正文代表新更新的资源。仅具有角色属性的正文不会描述角色资源,因为缺少 id。这通过增强冗余来降低复杂性。但对于一个好的rest-api,始终尝试使其尽可能简单并 self 声明。

简而言之,用路径指向您的资源管理器,并在正文中发送资源的完整定义,包括您已在路径中使用的 ID。

关于java - Spring PUT-Request,最好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58607545/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com