Envío de SMS en Go (Golang): integración con API de biblioteca
En el mundo moderno, el envío de mensajes SMS sigue siendo una función demandada para la verificación de usuarios, notificaciones y campañas de marketing. En Go (Golang) esto se implementa de manera fácil y eficiente gracias a las herramientas integradas para trabajar con HTTP y JSON. En este artículo, analizaremos cómo escribir una biblioteca propia para enviar SMS a través de una API REST, usando Go. El ejemplo se basará en un proveedor abstracto, pero el código se adapta fácilmente a cualquier servicio (Twilio, SMS.ru, Vonage, etc.).
Arquitectura de la biblioteca
Nuestra biblioteca constará de los siguientes componentes:
- Cliente para solicitudes HTTP con soporte de tiempos de espera y reintentos
- Estructuras para la solicitud (número, texto, remitente) y la respuesta (estado, ID del mensaje, error)
- Función de inicialización con clave API y URL base
- Método
SendSMSpara enviar un solo mensaje
Instalación y preparación
Para trabajar solo se necesita la biblioteca estándar de Go (net/http, encoding/json). No se requieren dependencias externas. Cree un archivo sms.go e incluya el paquete:
package smsclient
import ( "bytes" "encoding/json" "fmt" "net/http" "time")Estructuras de datos
Definamos los tipos para la solicitud y la respuesta:
// SMSRequest representa el cuerpo de la solicitud a la APItype SMSRequest struct { To string `json:"to"` // Número del destinatario en formato internacional Text string `json:"text"` // Texto del mensaje Sender string `json:"sender"` // Nombre del remitente (nombre alfa)}
// SMSResponse contiene el resultado del envíotype SMSResponse struct { Success bool `json:"success"` MessageID string `json:"message_id,omitempty"` Error string `json:"error,omitempty"`}Cliente para trabajar con la API
Creemos la estructura del cliente con configuración:
// Client gestiona el envío de SMS a través de la APItype Client struct { apiKey string baseURL string httpClient *http.Client}
// NewClient crea una nueva instancia del clientefunc NewClient(apiKey, baseURL string) *Client { return &Client{ apiKey: apiKey, baseURL: baseURL, httpClient: &http.Client{ Timeout: 10 * time.Second, }, }}Método de envío de SMS
Implementemos la lógica principal: enviar una solicitud POST con cuerpo JSON:
// SendSMS envía un SMS y devuelve la respuesta de la APIfunc (c *Client) SendSMS(req SMSRequest) (*SMSResponse, error) { // 1. Serializamos la solicitud a JSON body, err := json.Marshal(req) if err != nil { return nil, fmt.Errorf("error de marshaling de la solicitud: %w", err) }
// 2. Creamos la solicitud HTTP httpReq, err := http.NewRequest("POST", c.baseURL+"/sms/send", bytes.NewBuffer(body)) if err != nil { return nil, fmt.Errorf("error al crear la solicitud: %w", err) }
// 3. Establecemos los encabezados httpReq.Header.Set("Content-Type", "application/json") httpReq.Header.Set("Authorization", "Bearer "+c.apiKey)
// 4. Ejecutamos la solicitud resp, err := c.httpClient.Do(httpReq) if err != nil { return nil, fmt.Errorf("error al ejecutar la solicitud: %w", err) } defer resp.Body.Close()
// 5. Decodificamos la respuesta var smsResp SMSResponse if err := json.NewDecoder(resp.Body).Decode(&smsResp); err != nil { return nil, fmt.Errorf("error al decodificar la respuesta: %w", err) }
// 6. Verificamos el código de estado HTTP if resp.StatusCode != http.StatusOK { return &smsResp, fmt.Errorf("la API devolvió el código %d: %s", resp.StatusCode, smsResp.Error) }
return &smsResp, nil}Ejemplo de uso
Ahora mostremos cómo aplicar la biblioteca en código real:
package main
impo También en la biblioteca
Planificador de tareas PHP: gestor de colas similar a cron en PHP
gRPC para C++: bibliotecas, ejemplos y guía de uso
Cliente HTTP para Go (Golang): mejores bibliotecas para trabajar con HTTP
Colas de tareas para PHP: RabbitMQ, Gearman y Redis