Sobes.tech
Назад к вопросам
Junior — Middle
82

Каким образом вы организуете работу с внешним API в вашем проекте?

Ответ от нейросети

sobes.tech AI

При работе с внешним API в проекте на Go обычно организуют отдельный слой или пакет, отвечающий за взаимодействие с этим API. Основные моменты:

  • Инкапсуляция логики запросов — создается клиент с методами для каждого эндпоинта API.
  • Обработка ошибок и таймаутов — использование контекстов (context.Context) для контроля времени выполнения.
  • Десериализация и сериализация данных — работа с JSON или другим форматом.
  • Повторные попытки и резервные механизмы — при необходимости реализуются retry и fallback.

Пример простого клиента для GET-запроса:

package api

import (
    "context"
    "encoding/json"
    "net/http"
    "time"
)

type APIClient struct {
    baseURL    string
    httpClient *http.Client
}

func NewAPIClient(baseURL string) *APIClient {
    return &APIClient{
        baseURL: baseURL,
        httpClient: &http.Client{
            Timeout: 10 * time.Second,
        },
    }
}

type DataResponse struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

func (c *APIClient) GetData(ctx context.Context, endpoint string) (*DataResponse, error) {
    req, err := http.NewRequestWithContext(ctx, "GET", c.baseURL+endpoint, nil)
    if err != nil {
        return nil, err
    }

    resp, err := c.httpClient.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        return nil, fmt.Errorf("unexpected status: %s", resp.Status)
    }

    var data DataResponse
    if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
        return nil, err
    }

    return &data, nil
}

Таким образом, в проекте есть централизованный клиент, который можно использовать в сервисах или обработчиках, обеспечивая чистую архитектуру и удобство тестирования.