Выбор ответа 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) и отправляет заголовки.

Варианты ответа

  1. Статус 201 и заголовок X-Id, порядок вызовов не важен
  2. Статус 201 без X-Id: заголовок выставлен после Write
  3. panic: headers already written на вызове WriteHeader
  4. Статус 200 без X-Id: первый Write уже отправил заголовкиправильный ответ

Разбор

Первый вызов Write неявно вызывает WriteHeader(200) и отправляет заголовки. Дальнейший Header().Set уже ничего не меняет, а повторный WriteHeader игнорируется с записью в лог superfluous response.WriteHeader call. Паники нет. Правильный порядок: заголовки, WriteHeader, тело.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме