在 Go (Golang) 中发送短信:API 库集成

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 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

推荐