- 添加个人客户微信登录和手机验证码登录接口 - 实现个人客户设备、ICCID、手机号关联管理 - 添加短信发送服务(HTTP 客户端) - 添加微信认证服务(含 mock 实现) - 添加 JWT Token 生成和验证工具 - 创建数据库迁移脚本(personal_customer 关联表) - 修复测试文件中的路由注册参数错误 - 重构 scripts 目录结构(分离独立脚本到子目录) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
52 lines
1.2 KiB
Go
52 lines
1.2 KiB
Go
package sms
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
)
|
|
|
|
// StandardHTTPClient 标准 HTTP 客户端实现
|
|
type StandardHTTPClient struct {
|
|
client *http.Client
|
|
}
|
|
|
|
// NewStandardHTTPClient 创建标准 HTTP 客户端
|
|
func NewStandardHTTPClient(timeout int) *StandardHTTPClient {
|
|
return &StandardHTTPClient{
|
|
client: &http.Client{
|
|
Timeout: 0, // 使用 context 控制超时
|
|
},
|
|
}
|
|
}
|
|
|
|
// Post 发送 POST 请求
|
|
func (s *StandardHTTPClient) Post(ctx context.Context, url string, body []byte) ([]byte, error) {
|
|
req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(body))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("创建 HTTP 请求失败: %w", err)
|
|
}
|
|
|
|
req.Header.Set("Content-Type", "application/json;charset=utf-8")
|
|
req.Header.Set("Accept", "application/json")
|
|
|
|
resp, err := s.client.Do(req)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("发送 HTTP 请求失败: %w", err)
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
respBody, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("读取响应失败: %w", err)
|
|
}
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
return nil, fmt.Errorf("HTTP 状态码异常: %d, 响应: %s", resp.StatusCode, string(respBody))
|
|
}
|
|
|
|
return respBody, nil
|
|
}
|