Какие знаешь стандартные статус коды ответа http?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Стандартные HTTP-коды ответа: классификация и применение в Go
HTTP-коды состояния (Status Codes) — это стандартизированные числовые коды, которые сервер возвращает клиенту в ответ на его запрос. Они являются ключевым механизмом протокола HTTP для информирования клиента о результате обработки запроса. Все коды разделены на пять классов, определяемых первой цифрой.
Классы HTTP-кодов
- 1xx (Информационные): Запрос принят, процесс продолжается. В веб-разработке встречаются редко.
* `100 Continue` — клиент может продолжать отправку тела запроса.
* `101 Switching Protocols` — сервер соглашается сменить протокол (например, на WebSocket).
- 2xx (Успешные): Запрос успешно обработан.
* `200 OK` — стандартный ответ для успешных GET, PUT, POST или DELETE запросов.
* `201 Created` — запрос привел к созданию нового ресурса (обычно после POST).
* `204 No Content` — сервер успешно обработал запрос, но не возвращает никакого контента (часто после DELETE).
- 3xx (Перенаправления): Требуются дополнительные действия со стороны клиента для завершения запроса.
* `301 Moved Permanently` — ресурс навсегда перемещен по новому URL.
* `302 Found` — ресурс временно доступен по другому URL.
* `304 Not Modified` — ответ на условный GET, указывающий, что ресурс не изменился (используется для кэширования).
- 4xx (Ошибки клиента): Запрос содержит ошибку или не может быть выполнен.
* `400 Bad Request` — общая ошибка из-за неверного синтаксиса запроса.
* `401 Unauthorized` — требуется аутентификация.
* `403 Forbidden` — сервер понял запрос, но отказывается его авторизовать (нет прав).
* `404 Not Found` — сервер не может найти запрошенный ресурс.
* `429 Too Many Requests` — клиент отправил слишком много запросов за короткое время (регулирование, rate limiting).
- 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. Они являются основным языком общения между клиентом и сервером в веб-экосистеме.