Перейти к основному содержимому

Практика: 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.Handler
  • func 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 году — это не "старый способ". Это максимальный контроль, минимальные зависимости и отличная производительность.
Освой его — и любой фреймворк будет тебе понятен за день.