2025-08-04 17:16:38 +08:00
|
|
|
|
package alicloud
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"errors"
|
|
|
|
|
|
"fmt"
|
|
|
|
|
|
"io"
|
|
|
|
|
|
"net/http"
|
|
|
|
|
|
"net/url"
|
|
|
|
|
|
"strings"
|
2025-11-02 20:33:28 +08:00
|
|
|
|
"time"
|
2025-08-04 17:16:38 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
|
ErrDatasource = errors.New("数据源异常")
|
|
|
|
|
|
ErrSystem = errors.New("系统异常")
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// AlicloudConfig 阿里云配置
|
|
|
|
|
|
type AlicloudConfig struct {
|
|
|
|
|
|
Host string
|
|
|
|
|
|
AppCode string
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// AlicloudService 阿里云服务
|
|
|
|
|
|
type AlicloudService struct {
|
|
|
|
|
|
config AlicloudConfig
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// NewAlicloudService 创建阿里云服务实例
|
|
|
|
|
|
func NewAlicloudService(host, appCode string) *AlicloudService {
|
|
|
|
|
|
return &AlicloudService{
|
|
|
|
|
|
config: AlicloudConfig{
|
|
|
|
|
|
Host: host,
|
|
|
|
|
|
AppCode: appCode,
|
|
|
|
|
|
},
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// CallAPI 调用阿里云API的通用方法
|
|
|
|
|
|
// path: API路径(如 "api-mall/api/id_card/check")
|
|
|
|
|
|
// params: 请求参数
|
|
|
|
|
|
func (a *AlicloudService) CallAPI(path string, params map[string]interface{}) (respBytes []byte, err error) {
|
|
|
|
|
|
// 构建请求URL
|
|
|
|
|
|
reqURL := a.config.Host + "/" + path
|
|
|
|
|
|
|
|
|
|
|
|
// 构建请求参数
|
|
|
|
|
|
formData := url.Values{}
|
|
|
|
|
|
for key, value := range params {
|
|
|
|
|
|
formData.Set(key, fmt.Sprintf("%v", value))
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 创建HTTP请求
|
|
|
|
|
|
req, err := http.NewRequest("POST", reqURL, strings.NewReader(formData.Encode()))
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("%w: %s", ErrSystem, err.Error())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 设置请求头
|
|
|
|
|
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
|
|
|
|
|
|
req.Header.Set("Authorization", "APPCODE "+a.config.AppCode)
|
|
|
|
|
|
|
2025-11-02 20:33:28 +08:00
|
|
|
|
// 发送请求,超时时间设置为60秒
|
|
|
|
|
|
client := &http.Client{
|
|
|
|
|
|
Timeout: 60 * time.Second,
|
|
|
|
|
|
}
|
2025-08-04 17:16:38 +08:00
|
|
|
|
resp, err := client.Do(req)
|
|
|
|
|
|
if err != nil {
|
2025-11-02 20:33:28 +08:00
|
|
|
|
// 检查是否是超时错误
|
|
|
|
|
|
isTimeout := false
|
|
|
|
|
|
if netErr, ok := err.(interface{ Timeout() bool }); ok && netErr.Timeout() {
|
|
|
|
|
|
isTimeout = true
|
|
|
|
|
|
} else if errStr := err.Error();
|
|
|
|
|
|
errStr == "context deadline exceeded" ||
|
|
|
|
|
|
errStr == "timeout" ||
|
|
|
|
|
|
errStr == "Client.Timeout exceeded" ||
|
|
|
|
|
|
errStr == "net/http: request canceled" {
|
|
|
|
|
|
isTimeout = true
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if isTimeout {
|
|
|
|
|
|
return nil, fmt.Errorf("%w: API请求超时: %s", ErrDatasource, err.Error())
|
|
|
|
|
|
}
|
2025-08-04 17:16:38 +08:00
|
|
|
|
return nil, fmt.Errorf("%w: %s", ErrSystem, err.Error())
|
|
|
|
|
|
}
|
|
|
|
|
|
defer resp.Body.Close()
|
|
|
|
|
|
|
|
|
|
|
|
// 读取响应体
|
|
|
|
|
|
body, err := io.ReadAll(resp.Body)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("%w: %s", ErrSystem, err.Error())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回原始响应body,让调用方自己处理
|
|
|
|
|
|
return body, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetConfig 获取配置信息
|
|
|
|
|
|
func (a *AlicloudService) GetConfig() AlicloudConfig {
|
|
|
|
|
|
return a.config
|
|
|
|
|
|
}
|