Простой HTTP сервер
Условие
Напишите простой HTTP сервер на Go с несколькими эндпоинтами.
Требования
- GET /health - возвращает статус 200 и {"status": "ok"}
- GET /users/:id - возвращает информацию о пользователе по ID
- POST /users - создаёт нового пользователя
- Логирование всех запросов (метод, путь, время)
- 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)
Ответ сгенерирован нейросетью и может содержать ошибки
Простой HTTP сервер
Описание задачи
Реализовать HTTP сервер с:
- GET /health - проверка статуса
- GET /users/:id - получение пользователя
- POST /users - создание пользователя
- Логирование запросов
- X-Request-ID middleware
Архитектура
Используем стандартную net/http с несколькими подходами:
- Стандартный http.ServeMux
- Или chi/gin для красивого routing
Компоненты
- User структура с ID, Name, Email
- In-memory хранилище (map)
- Обработчики для каждого эндпоинта
- Middleware для логирования и X-Request-ID
- 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: положительное число
Тестирование
Тестируем:
- GET /health -> 200
- GET /users/1 -> 404 (нет пользователя)
- POST /users -> 201 с данными
- GET /users/1 -> 200 с данными
- POST /users без name -> 400
- Логирование работает
- X-Request-ID присутствует