> Что означает ошибка 400 в HTTP? (Go)
Уровень: middle · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Ozon
Стек: Go
> Пример ответа
Короткий ответ
Ошибка 400 (Bad Request) означает, что сервер не может или не будет обрабатывать запрос из-за ошибки на стороне клиента. Это сигнал, что запрос содержит некорректный синтаксис, невалидные параметры, отсутствующие обязательные поля или иные проблемы, которые клиент должен исправить перед повторной отправкой. Сервер при этом понял запрос, но счёл его неприемлемым.
Подробное объяснение
Код 400 относится к классу 4xx, то есть к клиентским ошибкам. В отличие от 500, где виноват сервер, здесь ответственность лежит на отправителе запроса. Причины могут быть разными: невалидный JSON, несоответствие типов, отсутствие обязательного заголовка, неправильный формат query-параметров, слишком длинный URI, недопустимые символы. Важно, что 400 не говорит о том, что ресурс не найден (это 404) или что нет прав (401/403). Это именно про некорректность самого запроса. В Go стандартная библиотека net/http позволяет легко вернуть этот статус через http.Error или w.WriteHeader(http.StatusBadRequest). При этом хорошей практикой считается возвращать в теле ответа детали ошибки, чтобы клиент мог её исправить.
На практике
В backend на Go ошибка 400 часто возникает при парсинге JSON: json.NewDecoder(r.Body).Decode(&req) вернёт ошибку, если тело невалидно. Также при валидации полей: отсутствует обязательное поле, число вне диапазона, строка не соответствует формату. В таких случаях принято возвращать 400 с описанием проблемы. Например, в REST API для создания пользователя отсутствие поля email - это 400, а не 422, хотя некоторые используют 422 для семантических ошибок. В Go удобно использовать middleware для централизованной обработки ошибок валидации и маппинга их в 400.
Пример кода
GOpackage mainimport ("encoding/json""net/http")type CreateUserRequest struct {Email string `json:"email"`Age int `json:"age"`}func createUserHandler(w http.ResponseWriter, r *http.Request) {var req CreateUserRequestif err := json.NewDecoder(r.Body).Decode(&req); err != nil {http.Error(w, "invalid JSON: "+err.Error(), http.StatusBadRequest)return}if req.Email == "" {http.Error(w, "email is required", http.StatusBadRequest)return}if req.Age < 0 || req.Age > 150 {http.Error(w, "age must be between 0 and 150", http.StatusBadRequest)return}w.WriteHeader(http.StatusCreated)json.NewEncoder(w).Encode(map[string]string{"status": "created"})}func main() {http.HandleFunc("/users", createUserHandler)http.ListenAndServe(":8080", nil)}
Как отвечать на собеседовании
Скажите, что 400 - это клиентская ошибка, означающая некорректный запрос. Приведите примеры: невалидный JSON, отсутствие обязательных полей, неправильные типы данных. Упомяните, что сервер должен возвращать понятное сообщение об ошибке в теле ответа, чтобы клиент мог исправиться. Отметьте, что в Go это делается через http.StatusBadRequest и http.Error. Если спросят про отличие от 422, поясните, что 422 - это семантическая ошибка, когда синтаксис верен, но данные не проходят бизнес-валидацию, хотя это не строгое правило.
Что проверяет интервьюер
Понимание разницы между клиентскими и серверными ошибками. Умение правильно выбирать статус-код в зависимости от ситуации. Знание, как в Go возвращать 400 и обрабатывать ошибки парсинга и валидации. Способность объяснить, почему важно возвращать детали ошибки клиенту. Также проверяется аккуратность в использовании терминов и отсутствие путаницы с 404, 401, 500.
Типичные ошибки
Путать 400 с 404 или 500. Возвращать 400 на ошибки сервера, например при падении базы данных. Не указывать в теле ответа причину ошибки, оставляя клиента без информации. Использовать 400 для ошибок аутентификации, хотя для этого есть 401. Считать, что 400 всегда означает проблему с JSON, игнорируя другие причины, такие как неверные заголовки или query-параметры. В Go забывать проверять ошибку Decode и возвращать 200 при невалидном теле запроса.
> Похожие задачи по Go
Что ищешь в работе и почему ушел с предыдущего проекта
Как определить, что запрос в базе тормозит
Что такое протокол HTTP и как он работает
Как транзакции обеспечивают консистентность данных
> Похожие задачи по backend
Что ищешь в работе и почему ушел с предыдущего проекта
Как определить, что запрос в базе тормозит
Что такое протокол HTTP и как он работает
Как транзакции обеспечивают консистентность данных
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью