Что выведет код Middle net/http и middleware обновлено
Что выведет Go: порядок выполнения middleware
Вопрос
Что выведет программа? Go 1.23, в go.mod указано go 1.23. Каждую строку вывода пишите с новой строки.
package main
import (
"fmt"
"net/http"
"net/http/httptest"
)
func mw(name string, next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Println(name, "до")
next.ServeHTTP(w, r)
fmt.Println(name, "после")
})
}
func main() {
final := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Println("обработчик")
w.WriteHeader(http.StatusTeapot)
})
h := mw("A", mw("B", final))
rec := httptest.NewRecorder()
h.ServeHTTP(rec, httptest.NewRequest("GET", "/", nil))
fmt.Println(rec.Code)
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: A до, B до, обработчик, B после, A после, 418. Внешний middleware A получает запрос первым и передаёт его B, тот вызывает обработчик.
Что выведет
A до
B до
обработчик
B после
A после
418
Разбор
Внешний middleware A получает запрос первым и передаёт его B, тот вызывает обработчик. Возврат идёт в обратном порядке. httptest.NewRecorder фиксирует статус 418.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Порядок записи заголовков и статуса
Следующий вопрос
Что выведет Go: выбор маршрута в ServeMux Go 1.22
Термины по теме
Ещё по теме «net/http и middleware»
- Статистика access-логов: ошибки и p95 на Go
- Разбор сырого HTTP/1.1 запроса на Go
- Разбор query-строки URL с декодированием на Go
- Маршрутизатор с параметрами пути в стиле ServeMux
- Rate limiter на токен-бакете для middleware на Go
- Зачем закрывать resp.Body
- Таймаут http.DefaultClient
- Обработчики net/http и горутины