Envío de SMS en Go (Golang): API bibliotecas golang-sms

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Envío de SMS en Go (Golang): API bibliotecas para trabajar con pasarelas SMS



En el desarrollo web moderno, el envío de mensajes SMS sigue siendo una funcionalidad demandada: autenticación de dos factores, notificaciones, campañas de marketing. El lenguaje Go (Golang), gracias a su rendimiento y simplicidad, es ideal para crear microservicios encargados del envío de mensajes. En este artículo, analizaremos cómo conectarse a una pasarela SMS a través de una API, utilizando la biblioteca estándar net/http y paquetes populares para trabajar con solicitudes HTTP.



Elección del enfoque: biblioteca estándar vs frameworks



Go proporciona una potente biblioteca estándar, suficiente para trabajar con cualquier API REST. Para enviar SMS no es necesario instalar frameworks pesados, basta con el paquete integrado net/http. Sin embargo, por comodidad, también consideraremos el uso de la biblioteca resty, que simplifica la formación de solicitudes.



Estructura básica de una solicitud HTTP en Go



Cualquier pasarela SMS acepta una solicitud POST con cuerpo JSON. Veamos un ejemplo de envío de mensaje a través de un servicio hipotético sms-provider.com:



package main

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

type SMSRequest struct { Phone string `json:"phone"` Message string `json:"message"` APIKey string `json:"api_key"`}

type SMSResponse struct { Status string `json:"status"` Message string `json:"message"`}

func sendSMS(phone, message, apiKey string) (*SMSResponse, error) { url := "https://api.sms-provider.com/v1/send"

reqBody := SMSRequest{ Phone: phone, Message: message, APIKey: apiKey, }

jsonData, err := json.Marshal(reqBody) if err != nil { return nil, fmt.Errorf("error de serialización JSON: %w", err) }

client := &http.Client{Timeout: 10 * time.Second} resp, err := client.Post(url, "application/json", bytes.NewBuffer(jsonData)) if err != nil { return nil, fmt.Errorf("error de solicitud HTTP: %w", err) } defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, fmt.Errorf("error al leer la respuesta: %w", err) }

var smsResp SMSResponse if err := json.Unmarshal(body, &smsResp); err != nil { return nil, fmt.Errorf("error al analizar la respuesta: %w", err) }

return &smsResp, nil}

func main() { resp, err := sendSMS("+79123456789", "Mensaje de prueba", "your-api-key-123") if err != nil { fmt.Printf("Error: %v", err) return } fmt.Printf("Estado: %s, Mensaje: %s", resp.Status, resp.Message)}


Uso de la biblioteca resty para simplificar el código



La biblioteca go-resty/resty/v2 reduce significativamente la cantidad de código boilerplate. Instalación:



go get github.com/go-resty/resty/v2


Ejemplo de envío de SMS con resty:



package main

import ( "fmt" "github.com/go-resty/resty/v2")

type SMSResponse struct { Status string `json:"status"` Message string `json:"message"`}

func sendSMSResty(phone, message, apiKey string) (*SMSResponse, error) { client := resty.New() resp, err := client.R(). SetHeader("Content-Type", "application/json"). SetBody(map[string]interface{}{ "phone": phone, "message": message, "api_key": apiKey, }). SetResult(&SMSResponse{}). Post("https://api.sms-provider.com/v1/send")

if err != nil { return nil, fmt.Errorf("error de solicitud: %w", err) }

return resp.Result().(*SMSResponse), nil}

func main() { resp, err := sendSMSResty("+79123456789", "¡Hola desde Go!", "my-secret-key") if err != nil { fmt.Prin

Recommendations