0Pricing
Go Academy · Урок

Создание 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 — локальная установка не требуется.

Все уроки этого курса

  1. Создание HTTP-сервера
  2. Маршрутизация и параметры пути
  3. Шаблон промежуточного обработчика
  4. Корректное завершение работы
← Назад к Go Academy