Envoi de SMS en Go (Golang) : API de la bibliothèque pour travailler avec les passerelles SMS
Dans le développement web moderne, l'envoi de messages SMS reste une fonctionnalité très demandée : authentification à deux facteurs, notifications, campagnes marketing. Le langage Go (Golang), grâce à ses performances et sa simplicité, est idéal pour créer des microservices dédiés à l'envoi de messages. Dans cet article, nous allons voir comment se connecter à une passerelle SMS via une API, en utilisant la bibliothèque standard net/http et des packages populaires pour gérer les requêtes HTTP.
Choix de l'approche : bibliothèque standard vs frameworks
Go fournit une bibliothèque standard puissante, suffisante pour travailler avec n'importe quelle API REST. Pour envoyer des SMS, il n'est pas nécessaire d'installer des frameworks lourds — le package intégré net/http est suffisant. Cependant, pour plus de commodité, nous examinerons également l'utilisation de la bibliothèque resty, qui simplifie la création de requêtes.
Structure de base d'une requête HTTP en Go
Toute passerelle SMS accepte une requête POST avec un corps JSON. Voici un exemple d'envoi de message via un service hypothétique 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("erreur de sérialisation 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("erreur de requête HTTP : %w", err) } defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, fmt.Errorf("erreur de lecture de la réponse : %w", err) }
var smsResp SMSResponse if err := json.Unmarshal(body, &smsResp); err != nil { return nil, fmt.Errorf("erreur d'analyse de la réponse : %w", err) }
return &smsResp, nil}
func main() { resp, err := sendSMS("+79123456789", "Message de test", "your-api-key-123") if err != nil { fmt.Printf("Erreur : %v", err) return } fmt.Printf("Statut : %s, Message : %s", resp.Status, resp.Message)}Utilisation de la bibliothèque resty pour simplifier le code
La bibliothèque go-resty/resty/v2 réduit considérablement la quantité de code boilerplate. Installation :
go get github.com/go-resty/resty/v2Exemple d'envoi de SMS avec 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("erreur de requête : %w", err) }
return resp.Result().(*SMSResponse), nil}
func main() { resp, err := sendSMSResty("+79123456789", "Bonjour depuis Go!", "my-secret-key") if err != nil { fmt.Prin