← Назад к вопросам

Простой HTTP сервер

1.0 Junior🔥 201 комментариев
#Основы Go

Условие

Напишите простой HTTP сервер на Go с несколькими эндпоинтами.

Требования

  1. GET /health - возвращает статус 200 и {"status": "ok"}
  2. GET /users/:id - возвращает информацию о пользователе по ID
  3. POST /users - создаёт нового пользователя
  4. Логирование всех запросов (метод, путь, время)
  5. Middleware для добавления заголовка X-Request-ID

Структура пользователя

type User struct {
    ID    int    `json:"id"`
    Name  string `json:"name"`
    Email string `json:"email"`
}

Дополнительно

  • Использовать стандартную библиотеку (net/http)
  • Или можете использовать gin/chi/echo

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Простой HTTP сервер

Описание задачи

Реализовать HTTP сервер с:

  • GET /health - проверка статуса
  • GET /users/:id - получение пользователя
  • POST /users - создание пользователя
  • Логирование запросов
  • X-Request-ID middleware

Архитектура

Используем стандартную net/http с несколькими подходами:

  1. Стандартный http.ServeMux
  2. Или chi/gin для красивого routing

Компоненты

  1. User структура с ID, Name, Email
  2. In-memory хранилище (map)
  3. Обработчики для каждого эндпоинта
  4. Middleware для логирования и X-Request-ID
  5. JSON кодирование/декодирование

GET /health

Просто возвращаем status 200 и JSON: {"status": "ok"}

GET /users/:id

Парсим ID из URL Ищем пользователя в хранилище Возвращаем 200 с JSON или 404

POST /users

Парсим JSON из body Валидируем Name и Email Создаем новый User с ID = max_id + 1 Возвращаем 201 с созданным пользователем

Логирование

Мидлвэр который:

  • Логирует метод и путь
  • Логирует время выполнения
  • Логирует код ответа

Формат: "[timestamp] METHOD /path - duration - status"

X-Request-ID

Мидлвэр который:

  • Генерирует UUID или counter
  • Добавляет в заголовок ответа X-Request-ID
  • Опционально добавляет в контекст

Сложность

  • GET /health: O(1)
  • GET /users/:id: O(1) - lookup в map
  • POST /users: O(1) - добавление в map

Проблемы и решения

Проблема: Race conditions при одновременных запросах Решение: использовать sync.RWMutex для хранилища

Проблема: Парсинг :id из URL Решение: с net/http нужны регулярные выражения или chi/gin

Проблема: JSON парсинг ошибок Решение: использовать json.Unmarshal с обработкой ошибок

Стандартный http.ServeMux

Ограничения:

  • Нет встроенной поддержки параметров :id
  • Нужно использовать regex или вручную парсить

Преимущества:

  • Стандартная библиотека
  • Нет внешних зависимостей

Chi/Gin подход

Чи:

  • Легкий и простой
  • Встроенная поддержка параметров

джин:

  • Быстрый
  • Больше фич

Валидация

  • Name: не пустая строка
  • Email: простая проверка на @
  • ID: положительное число

Тестирование

Тестируем:

  1. GET /health -> 200
  2. GET /users/1 -> 404 (нет пользователя)
  3. POST /users -> 201 с данными
  4. GET /users/1 -> 200 с данными
  5. POST /users без name -> 400
  6. Логирование работает
  7. X-Request-ID присутствует
Простой HTTP сервер | PrepBro