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

Практика: HTTP-клиент в Go


Онлайн редактор кода для Go

Здесь вы можете попробовать свои силы в программировании на языке Go. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.


❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.

Задание 1 — Простой клиент + обработка ошибок

Задание 1: Простой HTTP-клиент

⏱️ Примерное время: 10-15 минут

Напиши функцию FetchJSON(url string) (map[string]any, error). Сделай GET-запрос, верни распарсенный JSON. Обработай ошибки и статусы.


Требования:

  • client := &http.Client{Timeout: 10 * time.Second}
  • resp, err := client.Get(url)
  • defer resp.Body.Close()
  • проверяй resp.StatusCode == http.StatusOK
  • json.NewDecoder(resp.Body).Decode(&data)
  • возвращай ошибки с контекстом

Пример вывода:

Заголовок: My first post
Тело: ...

Задание 2 — Типизированный клиент для API

Задание 2: Типизированный клиент

⏱️ Примерное время: 20-25 минут

Создай структуру APIClient с методом `GetPost(id int) (*Post, error)`. Добавь BaseURL, Token, User-Agent.


Требования:

  • type APIClient struct { BaseURL, Token, UserAgent string; Client *http.Client }
  • NewAPIClient(base, token string) *APIClient
  • метод GetPost(ctx context.Context, id int) (*Post, error)
  • используй http.NewRequestWithContext
  • заголовки: Authorization, User-Agent, Accept: application/json

Пример:

  client := NewAPIClient("https://jsonplaceholder.typicode.com", "")
post, err := client.GetPost(context.Background(), 1)

Задание 3 — Retry + backoff

Задание 3: Клиент с retry и экспоненциальным backoff

⏱️ Примерное время: 25-35 минут

Добавь к клиенту retry: 3–5 попыток, backoff 1s → 2s → 4s, только для 5xx и сетевых ошибок.


Требования:

  • функция DoWithRetry(ctx context.Context, req *http.Request, max int) (*http.Response, error)
  • backoff: time.Sleep(time.Second << attempt)
  • retry на: err != nil, resp.StatusCode >= 500
  • логируй каждую попытку через slog

Пример вывода:

Попытка 1: 502 Bad Gateway → ждём 1s
Попытка 2: 200 OK

Задание 4 — Параллельные запросы + errgroup

Задание 4: Параллельные запросы к API

⏱️ Примерное время: 30-45 минут

Дан слайс ID. Запусти параллельные запросы через errgroup.WithContext. Собери результаты или первую ошибку.


Требования:

  • g, ctx := errgroup.WithContext(context.Background())
  • ctx, cancel := context.WithTimeout(ctx, 15*time.Second)
  • g.Go(func() error { ... })
  • канал результатов или map
  • обработай контекстную отмену

Пример вывода:

Получено 18 постов из 20
Ошибка: context deadline exceeded

Задание 5 — Загрузка файлов + multipart

Задание 5: Клиент с загрузкой файлов

⏱️ Примерное время: 35-50 минут

Напиши метод UploadFile(url, path string) (string, error). Отправь файл через multipart/form-data.


Требования:

  • var b bytes.Buffer; w := multipart.NewWriter(&b)
  • fw, _ := w.CreateFormFile("file", filepath.Base(path))
  • io.Copy(fw, file)
  • req, _ := http.NewRequest("POST", url, &b)
  • req.Header.Set("Content-Type", w.FormDataContentType())

Пример вывода:

Файл photo.jpg успешно загружен
Ответ сервера: `{"url":"https://.../photo.jpg"}`

Задание 6 — Итоговое: Полноценный клиент для внешнего API

Задание 6: Полноценный клиент для API (итоговое)

⏱️ Примерное время: 50-90 минут

Создай клиент для любого публичного API (JSONPlaceholder, GitHub, PokeAPI и т.д.) с retry, rate limiting, параллельными запросами, graceful shutdown.


Требования:

  • структура type APIClient struct { ... }
  • методы: GetPost, ListUsers, Search, BatchGet
  • retry 3–5 раз + exponential backoff
  • rate limiting: 10 req/s (time.Ticker или golang.org/x/time/rate)
  • параллельные запросы + errgroup
  • graceful shutdown (ctx отменяется при Ctrl+C)

Пример запуска:

client := NewAPIClient("https://jsonplaceholder.typicode.com")
posts, err := client.BatchGetPosts(context.Background(), []int{1,2,3,4,5})

Это задание — полноценный production-ready HTTP-клиент, готовый к использованию в реальных проектах.

подсказка

Хороший HTTP-клиент в 2026 году — это не просто http.Get. Это retry, rate limiting, типизация, параллелизм, graceful shutdown и понятные ошибки.
Освой чистый net/http — и любой клиентский фреймворк будет тебе понятен за час.