Выбор ответа Junior net/http и middleware спрашивают часто обновлено
Порядок записи заголовков и статуса
Вопрос
Что получит клиент?
func h(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("ok"))
w.Header().Set("X-Id", "1")
w.WriteHeader(http.StatusCreated)
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Статус 200 без X-Id: первый Write уже отправил заголовки. Первый вызов Write неявно вызывает WriteHeader(200) и отправляет заголовки.
Варианты ответа
- Статус 201 и заголовок X-Id, порядок вызовов не важен
- Статус 201 без X-Id: заголовок выставлен после Write
- panic: headers already written на вызове WriteHeader
- Статус 200 без X-Id: первый Write уже отправил заголовкиправильный ответ
Разбор
Первый вызов Write неявно вызывает WriteHeader(200) и отправляет заголовки. Дальнейший Header().Set уже ничего не меняет, а повторный WriteHeader игнорируется с записью в лог superfluous response.WriteHeader call. Паники нет. Правильный порядок: заголовки, WriteHeader, тело.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Статус ответа в middleware
Следующий вопрос
Что выведет Go: порядок выполнения middleware
Термины по теме
Ещё по теме «net/http и middleware»
- Статистика access-логов: ошибки и p95 на Go
- Разбор сырого HTTP/1.1 запроса на Go
- Разбор query-строки URL с декодированием на Go
- Маршрутизатор с параметрами пути в стиле ServeMux
- Rate limiter на токен-бакете для middleware на Go
- Зачем закрывать resp.Body
- Таймаут http.DefaultClient
- Обработчики net/http и горутины