Какие группы кодов ответа от сервера существуют
Что проверяют
Базовое знание HTTP и то, как оно ложится на net/http: какой код вернёт обработчик, если вы ничего не указали, и как клиент Go ведёт себя на ошибках. Следом обычно спрашивают разницу между 401 и 403 или какой код отдать на невалидный JSON.
Как отвечать
Групп пять, первая цифра задаёт класс:
- 1xx, информационные:
100 Continueдля заголовкаExpect: 100-continue,101 Switching Protocolsпри переходе на WebSocket,103 Early Hints; - 2xx, успех:
200 OK,201 Createdс заголовкомLocation,202 Acceptedдля асинхронной обработки,204 No Contentбез тела; - 3xx, перенаправления:
301и308постоянные,302и307временные, причём307и308не дают сменить метод.304 Not Modifiedотвечает на условный запрос сETag; - 4xx, ошибка клиента:
400запрос не разобран,401нет аутентификации,403прав нет,404,409конфликт состояния,422данные не прошли валидацию,429превышен лимит; - 5xx, ошибка сервера:
500,502плохой ответ апстрима,503сервис временно недоступен,504апстрим не ответил вовремя.
Дальше привяжите к Go. В обработчике коды берут из констант вроде http.StatusCreated, а w.WriteHeader зовут до первого w.Write: если сначала записать тело, уйдёт 200, а поздний вызов лишь даст в логе superfluous response.WriteHeader call. На клиенте http.Client не возвращает ошибку на 404 или 500, err бывает при сетевых сбоях, поэтому resp.StatusCode проверяют явно и всегда закрывают resp.Body. Редиректы клиент проходит сам, по умолчанию до десяти подряд, политика меняется через CheckRedirect.
Где спотыкаются
Путают 401 и 403. Первый про «кто вы», второй про «вам сюда нельзя».
Считают, что err == nil означает успешный ответ, и разбирают тело 500 как нормальный JSON.
Отдают 200 с полем "error" в теле на любые сбои. Мониторинг, ретраи и балансировщик ориентируются на код, и такие ошибки для них невидимы.