В чем разница между HTTP-методами POST и PUT?

Ответ

POST и PUT — это HTTP-методы с разной семантикой, определяемой стандартом REST.

POST (Создание)

Используется для создания нового ресурса, когда идентификатор (ID) неизвестен клиенту. Сервер генерирует ID и возвращает его в ответе.

  • Неидемпотентный: Повторные идентичные запросы создадут новые ресурсы.
  • Типичный статус ответа: 201 Created с заголовком Location.

Пример (Spring Boot):

@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user) {
    User savedUser = userRepository.save(user);
    URI location = ServletUriComponentsBuilder
        .fromCurrentRequest()
        .path("/{id}")
        .buildAndExpand(savedUser.getId())
        .toUri();
    return ResponseEntity.created(location).body(savedUser);
}

PUT (Полное обновление/Создание)

Используется для полного обновления ресурса по известному URI. Если ресурс не существует, может создавать его с предоставленным ID (идемпотентное создание).

  • Идемпотентный: Многократный повтор запроса даёт тот же результат.
  • Требует передачи всего представления ресурса.
  • Типичный статус ответа: 200 OK или 204 No Content.

Пример (Spring Boot):

@PutMapping("/users/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {
    user.setId(id); // Устанавливаем ID из пути
    User updatedUser = userRepository.save(user); // Сохраняем (обновляем или создаем)
    return ResponseEntity.ok(updatedUser);
}
Ключевые отличия: Аспект POST PUT
Семантика Создание Полное обновление (или создание с заданным ID)
Идемпотентность Нет Да
Идентификатор Определяется сервером Определяется клиентом (в URI)
Ответ 201 Created + Location 200 OK / 204 No Content

Ответ 18+ 🔞

А, слушай, про эти ваши HTTP-методы! Ну, классика же, блядь. POST и PUT — это как два брата, но один постоянно создаёт хуйню, а второй всё по полочкам раскладывает. Разберём, чтобы не путать, как мартышлюшка в зоопарке.

POST — это типа «роди, блядь, что-нибудь новое» Используется, когда ты приходишь на сервер и такой: «Слушай, я тут принёс какую-то хрень, но сам не знаю, куда её деть. Придумай ей место сам, а?». Сервер, сука, думает, генерит ID этой хрени и говорит: «Вот, держи, родил тебе сыночка, вот его адресок».

  • Неидемпотентный — это значит, если ты десять раз нажмёшь F5, он десять раз родит одинаковых уродцев. Овердохуища мусора получится.
  • Отвечает обычно: 201 Created и тыкает пальцем в заголовок Location — «вот, смотри, где твоё дитя лежит».

Пример (Spring Boot):

@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user) {
    User savedUser = userRepository.save(user);
    URI location = ServletUriComponentsBuilder
        .fromCurrentRequest()
        .path("/{id}")
        .buildAndExpand(savedUser.getId())
        .toUri();
    return ResponseEntity.created(location).body(savedUser);
}

PUT — это «замени всё, сука, на то, что я тебе даю» А вот это уже серьёзный дядька. Ты приходишь с чётким адресом: «На вот, по этому пути (/users/123) положи вот этот объект. Если там уже что-то было — выкинь нахуй и положи моё. Если пусто — создай с этим ID». Всё, пиздец. Разговор короткий.

  • Идемпотентный — можешь хоть сто раз слать, результат будет один. Как стучать головой в стену: хуй сломаешь, но стена не подвинется.
  • Требует ВСЕГО — полумеры не катят, отдавай полное представление ресурса, жмот.
  • Отвечает: 200 OK (вот, держи обновлённую хрень) или 204 No Content (всё заебись, но я тебе ничего назад не отдам, иди нахуй).

Пример (Spring Boot):

@PutMapping("/users/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {
    user.setId(id); // Устанавливаем ID из пути
    User updatedUser = userRepository.save(user); // Сохраняем (обновляем или создаем)
    return ResponseEntity.ok(updatedUser);
}

Короче, главные отличия, чтобы не быть пидарасом шерстяным:

Что сравниваем POST PUT
Смысл «Создай что-нибудь, я не знаю где» «Положи вот это ИМЕННО СЮДА, замени всё»
Идемпотентность Нет (рожает как кролик) Да (как талдычит одно и то же)
Кто ID назначает Сервер (он умный) Клиент (ты сам, типа «я тут главный»)
Ответ 201 Created + адрес (Location) 200 OK / 204 No Content (типа «сделано, отъебись»)

Вот и вся магия. Главное — не перепутай, а то вместо обновления пользователя начнёшь плодить их, как сука, и потом будешь думать, откуда у тебя в базе овердохуища одинаковых Вась.