在 Go (Golang) 中发送短信:API 库集成
在现代世界中,发送短信仍然是用户验证、通知和营销推广中不可或缺的功能。在 Go (Golang) 中,借助内置的 HTTP 和 JSON 处理工具,可以轻松高效地实现这一功能。在本文中,我们将探讨如何使用 Go 编写一个通过 REST API 发送短信的自定义库。示例将基于一个抽象的服务提供商,但代码可以轻松适配任何服务(如 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 通过 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, }, }}发送短信的方法
实现核心逻辑——发送带有 JSON 体的 POST 请求:
// SendSMS 发送短信并返回 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
impo