В чем разница между HTTP-статусами 200, 201 и 204?

Ответ

Это коды успешного выполнения (2xx), но с разной семантикой.

  • 200 OK — стандартный ответ на успешный запрос. Сервер возвращает запрошенные данные в теле ответа. Используется для GET, а также для PUT или POST, когда нужно вернуть результат.
  • 201 Created — ресурс успешно создан в результате запроса (обычно POST или PUT). В заголовках ответа должен присутствовать Location с URI нового ресурса. Тело ответа может содержать данные созданного объекта.
  • 204 No Content — запрос выполнен успешно, но серверу нечего вернуть в теле ответа. Используется для операций, где возврат данных не требуется или не имеет смысла (например, DELETE, или POST/PUT, которые только обновляют состояние).

Практические примеры:

# 200 OK — получение данных
GET /api/users/1 HTTP/1.1
HTTP/1.1 200 OK
Content-Type: application/json

{"id": 1, "name": "Alice"}

# 201 Created — создание ресурса
POST /api/users HTTP/1.1
Content-Type: application/json

{"name": "Bob"}

HTTP/1.1 201 Created
Location: /api/users/2
Content-Type: application/json

{"id": 2, "name": "Bob"}

# 204 No Content — успешное удаление
DELETE /api/users/2 HTTP/1.1
HTTP/1.1 204 No Content

Ответ 18+ 🔞

А, ну вот, опять про эти цифры, блядь, которые все путают! Слушай сюда, сейчас разложу по полочкам, как эти статусы на самом деле работают, а то народ безмозглый, блядь, вечно в них путается.

Вот есть у нас коды успеха, 2xx всякие. Вроде всё хорошо, запрос прошёл, но, сука, нюансы-то какие! Как будто тебе говорят: «Всё окей», но одним просто кивают, другим дают конфетку, а третьим и кивать-то лень.

200 OK — это как стандартное «ну да, чё, всё норм». Запрос отработал, и сервер тебе в ответ что-то плюнул в теле. Запросил пользователя — получил его данные. Отправил что-то через POST или PUT и хочешь увидеть, что там получилось — тоже 200. Базовый, понятный, скучный, как день сурка.

201 Created — а вот это уже интереснее, ёпта! Это когда ты не просто что-то сделал, а создал новую сущность. Обычно после POST. Сервер такой: «Опа, мужик, молодец, родил!». И он обязан, блядь, в заголовках ответа указать Location — адрес, где теперь этот новорождённый ресурс лежит. Может ещё и в теле ответа его данные отправить, типа «держи, полюбуйся на своё творение».

204 No Content — а это, блядь, высший пилотаж минимализма. Запрос выполнен, всё заебись, но сервер тебе ни хуя в ответ не присылает. Вообще. Пустое тело. Используется, когда возвращать просто нечего. Удалил запись (DELETE) — что тебе возвращать-то, пустоту? Или отправил команду на обновление, и тебе не нужен результат — вот тебе 204, иди нахуй, всё сделано. Экономят трафик, сука.

Практические примеры, чтобы не быть пиздабородатым теоретиком:

# 200 OK — получил данные, как и просил
GET /api/users/1 HTTP/1.1
HTTP/1.1 200 OK
Content-Type: application/json

{"id": 1, "name": "Alice"}

# 201 Created — создал нового юзера, вот тебе его адрес и данные
POST /api/users HTTP/1.1
Content-Type: application/json

{"name": "Bob"}

HTTP/1.1 201 Created
Location: /api/users/2
Content-Type: application/json

{"id": 2, "name": "Bob"}

# 204 No Content — удалил и пошёл нахуй, без лишних слов
DELETE /api/users/2 HTTP/1.1
HTTP/1.1 204 No Content

Вот и вся разница, блядь. Главное — не отправлять 204, когда клиент ждёт данных, а то он тебе ебальник нахуй свернёт. И наоборот, не городить 201 с Location, если ничего не создавал. А то будешь выглядеть как тот самый Герасим, который только «Муму» мычать может.