Отправка 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) Также в библиотеке
Конфигурация приложений C# (.NET): библиотеки и подходы
Генератор QR-кодов на Rust: создание и интеграция в веб-приложения
Event Bus и паттерн Observer в TypeScript: реализация и примеры
Генерация PDF в Java: обзор лучших библиотек (iText, Apache PDFBox, OpenPDF)
Работа с Markdown в Kotlin: библиотеки, парсинг и генерация