Практика: 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 — и любой клиентский фреймворк будет тебе понятен за час.