Практика: REST API на чистом net/http
Онлайн редактор кода для Go
Здесь вы можете попробовать свои силы в программировании на языке Go. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.
❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.
Задание 1 — Простой REST API: Hello + Echo
Задание 1: Hello World + Echo
⏱️ Примерное время: 10-15 минутСоздай сервер с двумя маршрутами: GET /hello → 'Привет, мир!', GET /echo/{text} → возвращает текст из пути.
Требования:
- используй
http.NewServeMux()+ паттерн-роутинг mux.HandleFunc("GET /hello", ...)mux.HandleFunc("GET /echo/{text}", func(w, r) { text := r.PathValue("text"); ... })- возвращай текст + статус 200
- тестируй через curl
Пример запроса:
curl http://localhost:8080/echo/Go_is_awesome
→ Go_is_awesome
Задание 2 — CRUD API для задач (ToDo List)
Задание 2: REST API для списка задач
⏱️ Примерное время: 25-35 минутСоздай in-memory ToDo API: GET /tasks, POST /tasks, GET /tasks/ {id}, PUT /tasks/{id}, DELETE /tasks/{id}. Храни задачи в map.
Требования:
- структура
Task { ID int; Title string; Completed bool; ... } - глобальная
map[int]*Task+sync.RWMutex - POST → JSON в теле → статус 201
GET /tasks/{id}→ 200 или 404- PUT → полное обновление
- DELETE → 204
- используй
r.PathValue("id")иjson.NewDecoder(r.Body).Decode()
Пример запроса:
curl -X POST http://localhost:8080/tasks -H "Content-Type: application/json" -d '{"title":"Купить молоко","completed":false}'
→ {"id":1,"title":"Купить молоко","completed":false}
Задание 3 — Middleware: логирование + простой auth
Задание 3: Middleware для логирования и базовой авторизации
⏱️ Примерное время: 20-30 минутДобавь два middleware: 1) логирование (метод, путь, длительность), 2) проверка заголовка Authorization: Bearer secret. Применяй к /tasks.
Требования:
func loggingMiddleware(next http.Handler) http.Handlerfunc authMiddleware(next http.Handler) http.Handler- цепочка:
handler := loggingMiddleware(authMiddleware(mux)) - при неверном токене → 401 Unauthorized
- логируй через
log.Printfилиslog
Пример вывода:
→ GET /tasks
← GET /tasks 12.345ms
Unauthorized: неверный токен
Задание 4 — Работа с query-параметрами и пагинация
Задание 4: Пагинация и фильтры через query
⏱️ Примерное время: 25-35 минутРасширь ToDo API: GET /tasks?limit=10&offset=20&completed=true&search=купить
Требования:
r.URL.Query().Get("limit"),strconv.Atoi(...)- фильтр по
completed(если передан) - поиск по подстроке в названии (
strings.Contains) - возвращай
{ "tasks": [...], "total": 100, "limit": 10, "offset": 20 }
Пример запроса:
curl "http://localhost:8080/tasks?limit=5&offset=10&completed=true&search=купить"
→ {"tasks":[...],"total":23,"limit":5,"offset":10}
Задание 5 — Загрузка и отдача файлов
Задание 5: Загрузка и скачивание файлов
⏱️ Примерное время: 35-50 минутДобавь POST /upload (multipart/form-data) и GET /files/{filename}. Сохраняй файлы в папку uploads.
Требования:
r.ParseMultipartForm(10 << 20)→ 10 MB лимитfile, header, err := r.FormFile("file")- сохраняй в
./uploads/+ оригинальное имя GET /files/{filename}→http.ServeFile(w, r, "./uploads/"+filename)- проверяй существование файла → 404
Пример запроса:
curl -X POST http://localhost:8080/upload -F "file=@photo.jpg"
→ Файл photo.jpg успешно загружен
curl http://localhost:8080/files/photo.jpg
→ (скачивает файл)
Задание 6 — Итоговое: Полноценное REST API с middleware и graceful
Задание 6: Полноценное REST API (итоговое)
⏱️ Примерное время: 50-90 минутСоздай REST API для управления задачами: CRUD, пагинация, поиск, загрузка файлов к задаче, middleware (логи, auth, CORS), graceful shutdown.
Требования:
- структура проекта:
api/
├── cmd/api/main.go
├── internal/
│ ├── models/
│ ├── repository/
│ └── service/
├── pkg/
│ ├── middleware/
│ └── utils/
└── uploads/ - middleware: logging, simple auth (Bearer), CORS
- graceful shutdown: сигнал → ctx 15s → srv.Shutdown
- in-memory хранилище + RWMutex
POST /tasks/{id}/files— загрузка файла к задачеGET /files/{filename}— скачивание
Пример запуска:
curl -X POST http://localhost:8080/tasks -d '{"title":"Купить билеты"}'
curl -X POST http://localhost:8080/tasks/1/files -F "file=@ticket.pdf"
Это задание — полноценное REST API на чистом net/http, готовое к продакшену.
Чистый net/http в 2026 году — это не "старый способ". Это максимальный контроль, минимальные зависимости и отличная производительность.
Освой его — и любой фреймворк будет тебе понятен за день.