Отправка SMS на Go (Golang): интеграция с API библиотеки

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Отправка SMS на Go (Golang): интеграция с API библиотеки

В современном мире отправка SMS-сообщений остаётся востребованной функцией для верификации пользователей, уведомлений и маркетинговых рассылок. На Go (Golang) это реализуется легко и эффективно благодаря встроенным средствам работы с HTTP и JSON. В этой статье мы разберём, как написать собственную библиотеку для отправки SMS через REST API, используя Go. Пример будет построен на абстрактном провайдере, но код легко адаптируется под любой сервис (Twilio, SMS.ru, Vonage и др.).

Архитектура библиотеки

Наша библиотека будет состоять из следующих компонентов:

  • Клиент для HTTP-запросов с поддержкой таймаутов и повторных попыток
  • Структуры для запроса (номер, текст, отправитель) и ответа (статус, ID сообщения, ошибка)
  • Функция инициализации с API-ключом и базовым URL
  • Метод SendSMS для отправки одного сообщения

Установка и подготовка

Для работы потребуется только стандартная библиотека Go (net/http, encoding/json). Никаких внешних зависимостей не нужно. Создайте файл sms.go и подключите пакет:

package smsclient

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
    "time"
)

Структуры данных

Определим типы для запроса и ответа:

// SMSRequest представляет тело запроса к API
type SMSRequest struct {
    To      string `json:"to"`      // Номер получателя в международном формате
    Text    string `json:"text"`    // Текст сообщения
    Sender  string `json:"sender"`  // Имя отправителя (альфа-имя)
}

// SMSResponse содержит результат отправки
type SMSResponse struct {
    Success   bool   `json:"success"`
    MessageID string `json:"message_id,omitempty"`
    Error     string `json:"error,omitempty"`
}

Клиент для работы с API

Создадим структуру клиента с конфигурацией:

// Client управляет отправкой SMS через API
type Client struct {
    apiKey    string
    baseURL   string
    httpClient *http.Client
}

// NewClient создаёт новый экземпляр клиента
func NewClient(apiKey, baseURL string) *Client {
    return &Client{
        apiKey:  apiKey,
        baseURL: baseURL,
        httpClient: &http.Client{
            Timeout: 10 * time.Second,
        },
    }
}

Метод отправки SMS

Реализуем основную логику — отправку POST-запроса с JSON-телом:

// SendSMS отправляет SMS и возвращает ответ от API
func (c *Client) SendSMS(req SMSRequest) (*SMSResponse, error) {
    // 1. Сериализуем запрос в JSON
    body, err := json.Marshal(req)
    if err != nil {
        return nil, fmt.Errorf("ошибка маршалинга запроса: %w", err)
    }

    // 2. Создаём HTTP-запрос
    httpReq, err := http.NewRequest("POST", c.baseURL+"/sms/send", bytes.NewBuffer(body))
    if err != nil {
        return nil, fmt.Errorf("ошибка создания запроса: %w", err)
    }

    // 3. Устанавливаем заголовки
    httpReq.Header.Set("Content-Type", "application/json")
    httpReq.Header.Set("Authorization", "Bearer "+c.apiKey)

    // 4. Выполняем запрос
    resp, err := c.httpClient.Do(httpReq)
    if err != nil {
        return nil, fmt.Errorf("ошибка выполнения запроса: %w", err)
    }
    defer resp.Body.Close()

    // 5. Декодируем ответ
    var smsResp SMSResponse
    if err := json.NewDecoder(resp.Body).Decode(&smsResp); err != nil {
        return nil, fmt.Errorf("ошибка декодирования ответа: %w", err)
    }

    // 6. Проверяем статус-код HTTP
    if resp.StatusCode != http.StatusOK {
        return &smsResp, fmt.Errorf("API вернул код %d: %s", resp.StatusCode, smsResp.Error)
    }

    return &smsResp, nil
}

Пример использования

Теперь покажем, как применить библиотеку в реальном коде:

package main

import (
    "fmt"
    "log"
    "smsclient" // замените на ваш путь
)

func main() {
    // 1. Создаём клиент
    client := smsclient.NewClient(
        "ваш_api_ключ_здесь",
        "https://api.sms-provider.ru/v1",
    )

    // 2. Формируем запрос
    request := smsclient.SMSRequest{
        To:     "79161234567",
        Text:   "Ваш код подтверждения: 1234",
        Sender: "MyApp",
    }

    // 3. Отправляем SMS
    response, err := client.SendSMS(request)                    

Рекомендаций