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/v2Ejemplo 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 También en la biblioteca
Trabajo con archivos ZIP en Go: guía completa del paquete archive/zip
Métricas de Prometheus en C# (.NET): integración y configuración
Generación de PDF en TypeScript: bibliotecas, herramientas y ejemplos de código
FluentValidation para C# (.NET): guía completa con ejemplos
Biblioteca estándar de Kotlin: revisión completa y ejemplos