Расскажите о стандартных кодах ответа HTTP и их классификации.

Ответ

HTTP-статус коды — это стандартные ответы сервера на запрос клиента. Они делятся на 5 основных классов:

  • 1xx (Informational / Информационные): Запрос получен, процесс продолжается. Клиент должен ожидать окончательного ответа.

    • 100 Continue: Сервер получил заголовки запроса, и клиент может продолжать отправлять тело запроса.
    • 101 Switching Protocols: Сервер переключает протоколы по требованию клиента (например, на WebSocket).
  • 2xx (Success / Успех): Запрос был успешно получен, понят и принят.

    • 200 OK: Стандартный успешный ответ.
    • 201 Created: Запрос выполнен, и в результате был создан новый ресурс.
    • 202 Accepted: Запрос принят к обработке, но она еще не завершена (используется для асинхронных операций).
    • 204 No Content: Сервер успешно обработал запрос, но в ответе нет тела (например, при удалении).
  • 3xx (Redirection / Перенаправление): Для выполнения запроса требуются дальнейшие действия со стороны клиента.

    • 301 Moved Permanently: Ресурс окончательно перемещен на новый URL.
    • 302 Found: Временное перенаправление. Клиент должен использовать старый URL для будущих запросов.
    • 304 Not Modified: Ответ на условный GET-запрос. Ресурс не изменился, тело ответа не передается.
  • 4xx (Client Error / Ошибка клиента): Запрос содержит синтаксическую ошибку или не может быть выполнен.

    • 400 Bad Request: Сервер не может обработать запрос из-за ошибки на стороне клиента (неверный синтаксис, некорректные данные).
    • 401 Unauthorized: Для доступа к ресурсу требуется аутентификация.
    • 403 Forbidden: У клиента нет прав доступа к ресурсу, даже если он аутентифицирован.
    • 404 Not Found: Сервер не может найти запрашиваемый ресурс.
    • 429 Too Many Requests: Клиент отправил слишком много запросов за определенный промежуток времени.
  • 5xx (Server Error / Ошибка сервера): Сервер не смог выполнить корректно составленный запрос.

    • 500 Internal Server Error: Общая ошибка сервера, возникшая в непредвиденной ситуации.
    • 502 Bad Gateway: Сервер, выступая в роли шлюза, получил недействительный ответ от вышестоящего сервера.
    • 503 Service Unavailable: Сервер временно не может обрабатывать запросы (из-за перегрузки или технического обслуживания).
    • 504 Gateway Timeout: Сервер-шлюз не дождался ответа от вышестоящего сервера.

В Go для удобства работы с кодами в пакете net/http определены константы. Вместо if/else для проверки статуса часто удобнее использовать switch:

import "net/http"

// ... после выполнения запроса ...

switch resp.StatusCode {
case http.StatusOK: // 200
    // Успешная обработка
case http.StatusCreated: // 201
    // Ресурс успешно создан
case http.StatusBadRequest: // 400
    // Ошибка в запросе клиента
case http.StatusNotFound: // 404
    // Ресурс не найден
case http.StatusInternalServerError: // 500
    // Внутренняя ошибка сервера
default:
    // Обработка других кодов
}

Ответ 18+ 🔞

О, это ж про наши любимые HTTP-статусы, блядь! Ну, слушай, сейчас разложу по полочкам, как бабушка на базаре. Это, типа, такие цифры, которые сервер тебе в ответ плюёт, когда ты к нему стучишься. Типа "понял — не понял", "иди нахуй" или "сам дурак". Всего их, этих циферок, пять семейств, как в мафии, только сисадминской.

Первая сотня (1хх) — Информационные.
Это когда сервер такой: "Ну, я твой запрос услышал, чувак, не переживай, обрабатываю. Но ты пока не расслабляйся, жди окончательного вердикта".

  • 100 Continue — "Давай, вали дальше тело запроса, я заголовки проглотил, жду продолжения банкета".
  • 101 Switching Protocols — "Ага, щас переключимся на другой протокол, типа WebSocket. Готовься, сука!"

Вторая сотня (2хх) — Успех.
Тут всё пиздато, запрос прошёл как по маслу.

  • 200 OK — классика, "всё заебись, держи ответ".
  • 201 Created — "Чувак, я по твоей просьбе тут новую хуйню создал, наслаждайся".
  • 202 Accepted — "Ладно, принял твою заявку в работу, но не дёргай меня, сделаю — отпишусь".
  • 204 No Content — "Всё сделал, но тебе на ответе нихуя не пришлю, типа удалил и всё, иди гуляй".

Третья сотня (3хх) — Перенаправления.
Тут сервер начинает мудохать тебя по разным углам.

  • 301 Moved Permanently — "Ресурс, блядь, переехал насовсем, новый адрес в заголовках, запоминай".
  • 302 Found — "А он сейчас временно тут, но ты всё равно потом стучи на старый адрес, я тебя перенаправлю".
  • 304 Not Modified — "Ты же просил только если изменилось? Не изменилось, сука! Качай из кеша и не грузи меня".

Четвёртая сотня (4хх) — Ошибки клиента.
А вот это уже твои косяки, дружок. Сервер в ярости.

  • 400 Bad Request — "Ты мне какую-то хуйню прислал, я даже разобрать не могу. Иди проверь, что ты там накодил".
  • 401 Unauthorized — "А ты кто такой? Предъяви пропуск, падла!"
  • 403 Forbidden — "Пропуск есть, но в этот кабинет тебе нельзя. Иди нахуй".
  • 404 Not Found — "Бля, ну нет тут того, что ты ищешь! Может, сам потерял?"
  • 429 Too Many Requests — "Охуел, что ли? Слишком много запросов за раз! Успокойся, подожди".

Пятая сотня (5хх) — Ошибки сервера.
А вот это уже пиздец на нашей стороне. Мы обосрались, но виноваты вы.

  • 500 Internal Server Error — "Короче, у нас тут всё упало, но мы не знаем почему. Сорян".
  • 502 Bad Gateway — "Я как шлюз запросил у другого сервака ответ, а он мне какую-то дичь прислал. Пиздец".
  • 503 Service Unavailable — "Сервер лег, блядь. То ли грузят, то ли ремонтируют. Заходи позже".
  • 504 Gateway Timeout — "Я ждал-ждал ответа от другого сервака, да так и не дождался. Заебал".

В Go, чтобы не запоминать эти циферки, в пакете net/http для них константы завели. И вместо этих бесконечных if resp.StatusCode == 200, можно switch использовать — красиво и понятно, ёпта!

import "net/http"

// ... после выполнения запроса ...

switch resp.StatusCode {
case http.StatusOK: // 200
    // Успешная обработка
case http.StatusCreated: // 201
    // Ресурс успешно создан
case http.StatusBadRequest: // 400
    // Ошибка в запросе клиента
case http.StatusNotFound: // 404
    // Ресурс не найден
case http.StatusInternalServerError: // 500
    // Внутренняя ошибка сервера
default:
    // Обработка других кодов
}

Вот и вся магия, блядь. Главное — помни: 2хх — хорошо, 4хх — ты обосрался, 5хх — обосрались мы. А 3хх — это как "ищи, сука, дальше".