← Назад к вопросам

Какие знаешь стандартные статус коды ответа http?

1.3 Junior🔥 261 комментариев
#Сетевые протоколы и API

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Стандартные HTTP-коды ответа: классификация и применение в Go

HTTP-коды состояния (Status Codes) — это стандартизированные числовые коды, которые сервер возвращает клиенту в ответ на его запрос. Они являются ключевым механизмом протокола HTTP для информирования клиента о результате обработки запроса. Все коды разделены на пять классов, определяемых первой цифрой.

Классы HTTP-кодов

  1. 1xx (Информационные): Запрос принят, процесс продолжается. В веб-разработке встречаются редко.
    *   `100 Continue` — клиент может продолжать отправку тела запроса.
    *   `101 Switching Protocols` — сервер соглашается сменить протокол (например, на WebSocket).

  1. 2xx (Успешные): Запрос успешно обработан.
    *   `200 OK` — стандартный ответ для успешных GET, PUT, POST или DELETE запросов.
    *   `201 Created` — запрос привел к созданию нового ресурса (обычно после POST).
    *   `204 No Content` — сервер успешно обработал запрос, но не возвращает никакого контента (часто после DELETE).

  1. 3xx (Перенаправления): Требуются дополнительные действия со стороны клиента для завершения запроса.
    *   `301 Moved Permanently` — ресурс навсегда перемещен по новому URL.
    *   `302 Found` — ресурс временно доступен по другому URL.
    *   `304 Not Modified` — ответ на условный GET, указывающий, что ресурс не изменился (используется для кэширования).

  1. 4xx (Ошибки клиента): Запрос содержит ошибку или не может быть выполнен.
    *   `400 Bad Request` — общая ошибка из-за неверного синтаксиса запроса.
    *   `401 Unauthorized` — требуется аутентификация.
    *   `403 Forbidden` — сервер понял запрос, но отказывается его авторизовать (нет прав).
    *   `404 Not Found` — сервер не может найти запрошенный ресурс.
    *   `429 Too Many Requests` — клиент отправил слишком много запросов за короткое время (регулирование, rate limiting).

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

Работа с HTTP-кодами в Go (net/http)

В Go пакет net/http предоставляет константы для всех стандартных кодов статуса и удобные методы для работы с ними.

Отправка кода состояния вместе с ответом:

import "net/http"

func handler(w http.ResponseWriter, r *http.Request) {
    // Успешное создание ресурса
    w.WriteHeader(http.StatusCreated)
    w.Write([]byte(`{"id": 42, "status": "created"}`))

    // Или сразу с JSON (чаще используется)
    // w.Header().Set("Content-Type", "application/json")
    // http.Error(w, `{"error": "not found"}`, http.StatusNotFound)
}

// Использование http.Error для отправки ошибок клиента
func anotherHandler(w http.ResponseWriter, r *http.Request) {
    user, err := getUser(r)
    if err != nil {
        // 400 Bad Request при ошибке валидации
        http.Error(w, "Invalid user data", http.StatusBadRequest)
        return
    }

    if !user.IsAuthenticated {
        // 401 Unauthorized для неаутентифицированных запросов
        http.Error(w, "Authentication required", http.StatusUnauthorized)
        return
    }
}

Проверка кода ответа на клиентской стороне:

resp, err := http.Get("https://api.example.com/data")
if err != nil {
    // Обработка сетевой ошибки
    log.Fatal(err)
}
defer resp.Body.Close()

// Анализ статус-кода
switch resp.StatusCode {
case http.StatusOK:
    fmt.Println("Успешный запрос")
    // Декодируем тело ответа...
case http.StatusNotFound:
    fmt.Println("Ресурс не найден")
case http.StatusInternalServerError:
    fmt.Println("Внутренняя ошибка сервера")
default:
    fmt.Printf("Получен неожиданный код: %d\n", resp.StatusCode)
}

// Или просто проверяем класс кода
if resp.StatusCode >= 200 && resp.StatusCode < 300 {
    fmt.Println("Запрос успешен (2xx)")
}

Важные практики для Go-разработчика

  • Используйте подходящие коды: Не ограничивайтесь только 200 и 500. 201 Created, 204 No Content, 400 Bad Request или 409 Conflict делают ваше API более идиоматичным и понятным для клиентов.
  • Константы вместо чисел: Всегда используйте константы из net/http, например http.StatusOK, а не магическое число 200. Это улучшает читаемость и предотвращает ошибки.
  • Сочетайте код с телом ответа: Код 4xx или 5xx должен сопровождаться понятным сообщением об ошибке в теле ответа (чаще в формате JSON для API).
  • WriteHeader вызывается один раз: В Go метод WriteHeader можно вызвать лишь один раз для одного ответа. Последующие вызовы игнорируются. Код по умолчанию — 200 OK.
  • Порядок важен: Устанавливайте статус-код (WriteHeader) до записи в тело ответа, если вы не используете вспомогательные функции, которые делают это автоматически (как http.Error).

Понимание и корректное применение HTTP-кодов состояния — это фундаментальный навык для разработчика бэкенда, критически важный для создания надежных, предсказуемых и хорошо документированных RESTful API и веб-сервисов на Go. Они являются основным языком общения между клиентом и сервером в веб-экосистеме.