> Что такое протокол HTTP и как он работает (Go)

Уровень: junior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Ozon

Стек: Go

> Пример ответа

Короткий ответ

HTTP - это текстовый протокол прикладного уровня для обмена данными между клиентом и сервером по модели запрос-ответ. Клиент отправляет запрос с методом, URL, заголовками и телом, сервер возвращает ответ со статус-кодом, заголовками и телом. Протокол работает поверх TCP, а в Go реализован в пакете net/http.

Подробное объяснение

HTTP расшифровывается как HyperText Transfer Protocol. Он описывает формат сообщений и правила их передачи, но не управляет транспортом: обычно используется TCP, а в HTTP/3 - QUIC поверх UDP. Каждый запрос содержит метод (GET, POST, PUT, DELETE и другие), путь, версию протокола, заголовки и опциональное тело. Ответ содержит версию, статус-код (200, 404, 500), заголовки и тело.

HTTP является stateless-протоколом: сервер не хранит состояние между запросами по умолчанию. Состояние добавляют через cookies, токены или сессии. Версии протокола различаются: HTTP/1.1 держит одно соединение для нескольких запросов, HTTP/2 мультиплексирует потоки в одном TCP-соединении, HTTP/3 использует QUIC.

В Go сервер строится на http.Server и http.Handler. Клиент использует http.Client. Пакет net/http сам управляет парсингом запросов, заголовками, keep-alive и таймаутами, если их настроить.

На практике

В backend на Go HTTP - основной способ предоставить API. Типичный сервер регистрирует обработчики через http.HandleFunc или http.NewServeMux, читает тело через r.Body, пишет ответ через w.Write или json.NewEncoder(w).Encode. Важно закрывать тело запроса и ответа, задавать Content-Type, обрабатывать ошибки и не забывать про таймауты, чтобы избежать утечек соединений.

Пример кода

GO
package main
import (
"encoding/json"
"log"
"net/http"
)
type response struct {
Message string `json:"message"`
}
func helloHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(response{Message: "hello"})
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/hello", helloHandler)
srv := &http.Server{
Addr: ":8080",
Handler: mux,
}
log.Fatal(srv.ListenAndServe())
}

Как отвечать на собеседовании

Скажите, что HTTP - это протокол прикладного уровня по модели запрос-ответ. Упомяните структуру запроса и ответа, методы, статус-коды, заголовки и тело. Отметьте, что протокол stateless и работает поверх TCP, а в Go реализован в net/http. Кратко сравните HTTP/1.1, HTTP/2 и HTTP/3.

Что проверяет интервьюер

Понимание базовой модели клиент-сервер и формата сообщений. Знание методов, статус-кодов и заголовков. Понимание stateless-природы и способов хранить состояние. Умение работать с net/http в Go: обработчики, клиент, таймауты, закрытие тел.

Типичные ошибки

Путать HTTP с TCP и говорить, что HTTP устанавливает соединение. Считать протокол stateful по умолчанию. Забывать закрывать r.Body и resp.Body. Не задавать таймауты у http.Server и http.Client. Игнорировать разницу версий протокола и особенности мультиплексирования.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью