Создание HTTP-сервера
ListenAndServe, HandlerFunc и ServeMux
«Создание HTTP-сервера» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Пакет net/http
Стандартная библиотека Go net/http предоставляет готовый к использованию в production сервер HTTP/1.1 и HTTP/2 без внешних зависимостей.
Базовый сервер
Зарегистрируйте обработчик с помощью http.HandleFunc и начните прослушивание с помощью http.ListenAndServe:
http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, World!")
})
log.Fatal(http.ListenAndServe(":8080", nil))Интерфейс http.Handler
Любой тип, реализующий ServeHTTP(ResponseWriter, *Request), является http.Handler. Используйте его для обработчиков с состоянием, содержащих базу данных или конфигурацию.
type App struct{ db *sql.DB }
func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// use a.db
}ServeMux
http.NewServeMux() создаёт изолированный маршрутизатор. Передайте его в http.ListenAndServe, чтобы не использовать глобальный мультиплексор по умолчанию, что безопаснее в библиотеках.
mux := http.NewServeMux()
mux.HandleFunc("/api/users", usersHandler)
http.ListenAndServe(":8080", mux)Отправка ответов с кодами состояния
Запишите код состояния с помощью w.WriteHeader(code) до записи тела ответа. Если вызвать только w.Write, по умолчанию будет использован код 200.
w.WriteHeader(http.StatusCreated)
w.Write([]byte("created"))Запись ответов в формате JSON
Задайте Content-Type до записи тела, затем выполните кодирование с помощью json.Encoder:
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(data)Чтение запроса
Получайте метод, URL, заголовки, параметры запроса и тело через структуру *Request.
r.Method // "GET", "POST", ...
r.URL.Path // "/api/users"
r.URL.Query().Get("id") // query param
r.Header.Get("Authorization")Разбор тела запроса в формате JSON
Decode тело запроса с помощью json.Decoder. Ограничьте размер тела с помощью http.MaxBytesReader, чтобы предотвратить исчерпание памяти.
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
var req CreateUserRequest
json.NewDecoder(r.Body).Decode(&req)Конфигурация сервера
Настройте время ожидания с помощью собственного http.Server, чтобы предотвратить атаки медленных клиентов:
srv := &http.Server{
Addr: ":8080",
Handler: mux,
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 120 * time.Second,
}
srv.ListenAndServe()HTTPS
Используйте srv.ListenAndServeTLS(certFile, keyFile) для обслуживания HTTPS. Сертификаты могут быть самоподписанными (для разработки) или выданными Let's Encrypt (для production через golang.org/x/crypto/acme/autocert).
Композиция обработчиков
Оборачивайте обработчики, чтобы добавлять сквозные задачи (журналирование, аутентификацию, восстановление после паники), не изменяя бизнес-логику. После внесения изменений возвращайте следующий обработчик.
Быстрая проверка
Почему следует задавать ReadTimeout и WriteTimeout для http.Server?
Итоги: создание HTTP-сервера
Ключевые моменты:
- HandleFunc + ListenAndServe для простых серверов
- Собственный http.Server с ограничениями времени ожидания для production
- ServeMux для изолированной маршрутизации
- json.NewEncoder(w) для ответов в формате JSON
Часто задаваемые вопросы
Урок «Создание HTTP-сервера» бесплатный?
Да — полный текст урока «Создание HTTP-сервера» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Создание HTTP-сервера»?
ListenAndServe, HandlerFunc и ServeMux Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Создание HTTP-сервера»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Создание HTTP-сервера
- Маршрутизация и параметры пути
- Шаблон промежуточного обработчика
- Корректное завершение работы