В контексте HTTP/REST: допустимо ли изменять данные на сервере через GET-метод?

«В контексте HTTP/REST: допустимо ли изменять данные на сервере через GET-метод?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, это нарушает спецификацию HTTP и принципы REST.

  • GET должен быть безопасным (safe) и идемпотентным (idempotent). Он предназначен только для получения данных и не должен изменять состояние сервера.
  • Практические риски:
    • Кеширование: Прокси и браузеры могут кешировать GET-запросы, что приведет к непредсказуемому поведению.
    • Повторные запросы: Обновление страницы или повторная отправка ссылки вызовет операцию снова.
    • Безопасность: Параметры GET видны в URL, истории браузера и логах сервера.

Неправильный подход (Spring Boot пример):

@GetMapping("/updateUser")
public void updateUser(@RequestParam Long id) {
    userService.updateStatus(id); // Нарушение! Изменение состояния через GET.
}

Правильный подход: Используйте методы, предназначенные для модификации:

  • POST — для создания.
  • PUT/PATCH — для обновления.
  • DELETE — для удаления.

Пример корректного кода:

@PostMapping("/users/{id}/activate")
public ResponseEntity<Void> activateUser(@PathVariable Long id) {
    userService.activate(id);
    return ResponseEntity.ok().build();
}