| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- package exchange
- import (
- "app/commons/core"
- "bytes"
- "crypto/md5"
- "encoding/hex"
- "encoding/json"
- "fmt"
- "github.com/demdxx/gocast"
- "io"
- "io/ioutil"
- "net/http"
- "sort"
- "strings"
- )
- var isDebug = false
- func Get[T any](url string) (*T, error) {
- return get[T](url)
- }
- func get[T any](url string) (*T, error) {
- obj := new(T)
- resp, err := http.Get(url)
- if err != nil {
- return obj, err
- }
- defer resp.Body.Close() // 确保在函数结束时关闭响应体
- // 检查响应状态码
- if resp.StatusCode != http.StatusOK {
- return obj, fmt.Errorf("error:%d", resp.StatusCode)
- }
- // 读取响应体
- body, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- return obj, err
- }
- err = json.Unmarshal(body, &obj)
- if isDebug {
- core.Log.Infof("get请求:%s 返回:%s", url, body)
- }
- return obj, err
- }
- func post[T any](uri string, data []byte) (*T, error) {
- obj := new(T)
- // 创建一个新的 POST 请求
- req, err := http.NewRequest("POST", uri, bytes.NewBuffer(data))
- if err != nil {
- return obj, err
- }
- // 设置请求头
- req.Header.Set("Content-Type", "application/json")
- // 发送请求
- client := &http.Client{}
- resp, err := client.Do(req)
- if err != nil {
- return obj, err
- }
- defer resp.Body.Close()
- // 读取响应
- body, err := io.ReadAll(resp.Body)
- if err != nil {
- return obj, err
- }
- if isDebug {
- core.Log.Infof("post请求:请求:%s data:%s 返回:%s", uri, data, body)
- }
- err = json.Unmarshal(body, &obj)
- return obj, err
- }
- // signMd5 md5签名
- func signMd5(req map[string]interface{}) string {
- keys := make([]string, 0, len(req))
- for k := range req {
- if k == "sign" {
- continue
- }
- keys = append(keys, k)
- }
- sort.Strings(keys)
- // 拼接键值对
- var sb strings.Builder
- for _, k := range keys {
- if gocast.ToString(req[k]) == "" {
- continue
- }
- sb.WriteString(fmt.Sprintf("%s%s", k, gocast.ToString(req[k])))
- }
- // 计算 MD5 哈希
- str := fmt.Sprintf("%s%s", sb.String(), conf().Secret)
- hash := md5.Sum([]byte(str))
- core.Log.Infof("sb:%s secret:%s str:%s sign str:%s", sb.String(), conf().Secret, str, hex.EncodeToString(hash[:]))
- // 将哈希值转换为十六进制字符串
- return hex.EncodeToString(hash[:])
- }
- // 将结构体转换为 JSON map
- func structToJSONMap(obj interface{}) (map[string]interface{}, error) {
- // 将结构体编码为 JSON
- data, err := json.Marshal(obj)
- if err != nil {
- return nil, err
- }
- // 定义一个 map 用于存储 JSON 数据
- var result map[string]interface{}
- // 将 JSON 解码到 map 中
- err = json.Unmarshal(data, &result)
- if err != nil {
- return nil, err
- }
- return result, nil
- }
|