【问题标题】:Spring PUT-Request, best way to do itSpring PUT-Request,最好的方法
【发布时间】:2019-10-29 23:16:42
【问题描述】:

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

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

@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-Request 的最佳方式是什么?

编辑:我显然可以将 URL 更改为 .../roles/role 之类的东西,而无需 PathVariable,只需在 RequestBody 中发送 newRole。但这不是 PUT-Request URL 通常应该的样子,对吧?

【问题讨论】:

  • roleId 是角色不可分割的一部分吗?或者只是因为你把它放在数据库/地图中并用它作为键而使用它?
  • 您的第一种方法可以正确处理找到不存在角色的情况,而后者则不会,并允许通过更新方法添加新角色。不确定这是否是你真正想要的。此外,该代码实际上应该在服务类中,而不是在控制器中,并且对于映射,您可能需要像 MapStruct 这样的框架。你能做第二个吗,是的,你可能不会。

标签: java spring rest http


【解决方案1】:

看看this 的帖子。 Restful Api 应该是自我解释的,而不是要尽可能保存每个字节。 Restful Api 遵循声明你想做什么的原则。 在您的示例中,您要更新角色。一个角色包含一个 id 和一个角色名称。路径变量描述资源的唯一路径,requestbody 代表新更新的资源。仅具有属性角色的主体不会描述角色资源,因为缺少 id。这通过增强冗余来降低复杂性。但是对于一个好的 rest-api 来说,总是尽量保持简单和自我声明。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2011-07-28
    • 2021-12-23
    • 1970-01-01
    • 2017-04-10
    • 2013-12-20
    • 2019-06-06
    相关资源
    最近更新 更多