Spring PUT-Request, лучший способ сделать это - PullRequest
0 голосов
/ 29 октября 2019

Итак, я знаю, что в REST, обычно, когда я делаю PUT-запрос, я должен указать ресурс, который я хочу обновить, в URL-адресе, например, так: .../collections/{collectionId}

Реализация этого при весенней загрузке дляМой ресурс 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);
  }
}

Но это не так, как нужно, потому что newRole внутри RequestBody уже содержит идентификатор, поэтому я мог бы просто сделать вместо этого:

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

Это приводит к неиспользованному PathVariable, но мне это не нужно, потому что newRole уже содержит идентификатор. Итак, каков оптимальный способ выполнения PUT-запроса, подобного этому?

Редактировать: очевидно, я мог бы просто изменить URL-адрес на что-то вроде .../roles/role, не имея PathVariable и просто отправив newRole внутри RequestBody. Но это не то, как должен выглядеть URL-адрес PUT-запроса, верно?

1 Ответ

1 голос
/ 29 октября 2019

Посмотрите на этот пост. Restful Api должен быть самоочевидным и не должен сохранять каждый возможный байт. Restful Api следует принципу объявления того, что вы хотите сделать. В вашем примере вы хотите обновить роль. Роль содержит идентификатор и имя роли. Переменная пути описывает уникальный путь к ресурсу, а объект запроса представляет новый обновленный ресурс. Тело только с ролью свойства не описывает ресурс роли, поскольку идентификатор отсутствует. Это уменьшает сложность за счет повышения избыточности. Но для хорошего отдыха api всегда старайтесь держать его как можно более простым и самостоятельно декларирующим.

Вкратце, укажите пути к вашему ресурсу и отправьте полное определение вашего ресурса в теле, включая идентификаторвы уже использовали в пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...