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

Ответ

Основное концептуальное различие заключается в семантике операций над ресурсами в RESTful API.

POST используется для создания нового ресурса, когда его идентификатор (ID) неизвестен или определяется сервером. Клиент отправляет данные в коллекцию.

  • Неидемпотентен: Повторный идентичный запрос создаст новый, дублирующий ресурс.
  • Типичный статус ответа: 201 Created (с заголовком Location).
  • Целевой URI: Коллекция (например, /users).

PUT используется для полного обновления существующего ресурса с известным идентификатором. Клиент отправляет полное представление ресурса по конкретному URI. PUT также может использоваться для создания, если клиент сам определяет ID ресурса.

  • Идемпотентен: Многократное выполнение одного и того же запроса даст тот же результат (ресурс будет обновлен до одного и того же состояния).
  • Типичные статусы ответа: 200 OK или 204 No Content.
  • Целевой URI: Конкретный ресурс (например, /users/123).

Пример на Python с библиотекой requests:

import requests
import json

# POST: Создание нового пользователя (ID назначит сервер)
new_user = {"name": "John", "email": "john@example.com"}
post_response = requests.post('https://api.example.com/users', json=new_user)
print(f"POST Status: {post_response.status_code}")  # Ожидается 201
print(f"Location: {post_response.headers.get('Location')}")

# PUT: Полное обновление пользователя с ID 123
updated_user = {"id": 123, "name": "John Doe", "email": "john.doe@example.com"}
put_response = requests.put('https://api.example.com/users/123', json=updated_user)
print(f"PUT Status: {put_response.status_code}")  # Ожидается 200 или 204

Для частичного обновления следует использовать метод PATCH.

Ответ 18+ 🔞

Давай разберём эту хуйню, которая всех новичков вгоняет в ступор. POST и PUT — это как два брата-близнеца, но один из них полный мудак, который плодит копии, а второй — педантичный зануда, который всё хочет контролировать.

Смотри, суть в том, куда ты тыкаешь свой запрос и что от этого получается.

POST — это как крикнуть в пустоту: «Эй, сервер, роди мне тут что-нибудь новенькое!». Ты шлёшь данные в коллекцию (/users), а сервер, ёпта, сам решает, какой ID этому детищу присвоить и куда его пристроить.

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

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

  • Идемпотентен: А вот это уже приятно. Сколько раз ни жми F5 — после первого запроса результат не изменится. Обновил и хватит. Стабильность, ебать.
  • Что в ответ? 200 OK или 204 No Content — типа «понял, принял, сделал, отъебись».
  • Особый прикол: PUT'ом можно и создать ресурс, но только если ты сам, хитрая жопа, знаешь его будущий ID и стучишься прямо по нему (PUT /users/999). Сервер такой: «О, на /users/999 ничего нет? Ну раз клиент так хочет — создам там именно это».

А теперь смотри, как это выглядит в коде, чтобы не быть тем самым мудаком, который POST'ом апдейты делает.

import requests
import json

# POST: Делаем ребёнка. Сервер даст ему имя (ID).
new_user = {"name": "John", "email": "john@example.com"}
post_response = requests.post('https://api.example.com/users', json=new_user)
print(f"POST Status: {post_response.status_code}")  # Ожидается 201
print(f"Location: {post_response.headers.get('Location')}") # Адрес, где лежит младенец

# PUT: Ломаем и перестраиваем пользователя с ID 123. Всё, что было — в утиль.
updated_user = {"id": 123, "name": "John Doe", "email": "john.doe@example.com"}
put_response = requests.put('https://api.example.com/users/123', json=updated_user)
print(f"PUT Status: {put_response.status_code}")  # Ожидается 200 или 204

И главное, запомни, ебушки-воробушки: если нужно поменять только одно поле (например, только имя), то это работа для PATCH, а не для PUT. PUT — это когда ты приносишь целый новый чертёж и говоришь «строй по нему, старьё — нахуй».