ex_method.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package exchange
  2. import (
  3. "app/commons/core"
  4. "bytes"
  5. "crypto/md5"
  6. "encoding/hex"
  7. "encoding/json"
  8. "fmt"
  9. "github.com/demdxx/gocast"
  10. "io"
  11. "io/ioutil"
  12. "net/http"
  13. "sort"
  14. "strings"
  15. )
  16. var isDebug = false
  17. func Get[T any](url string) (*T, error) {
  18. return get[T](url)
  19. }
  20. func get[T any](url string) (*T, error) {
  21. obj := new(T)
  22. resp, err := http.Get(url)
  23. if err != nil {
  24. return obj, err
  25. }
  26. defer resp.Body.Close() // 确保在函数结束时关闭响应体
  27. // 检查响应状态码
  28. if resp.StatusCode != http.StatusOK {
  29. return obj, fmt.Errorf("error:%d", resp.StatusCode)
  30. }
  31. // 读取响应体
  32. body, err := ioutil.ReadAll(resp.Body)
  33. if err != nil {
  34. return obj, err
  35. }
  36. err = json.Unmarshal(body, &obj)
  37. if isDebug {
  38. core.Log.Infof("get请求:%s 返回:%s", url, body)
  39. }
  40. return obj, err
  41. }
  42. func post[T any](uri string, data []byte) (*T, error) {
  43. obj := new(T)
  44. // 创建一个新的 POST 请求
  45. req, err := http.NewRequest("POST", uri, bytes.NewBuffer(data))
  46. if err != nil {
  47. return obj, err
  48. }
  49. // 设置请求头
  50. req.Header.Set("Content-Type", "application/json")
  51. // 发送请求
  52. client := &http.Client{}
  53. resp, err := client.Do(req)
  54. if err != nil {
  55. return obj, err
  56. }
  57. defer resp.Body.Close()
  58. // 读取响应
  59. body, err := io.ReadAll(resp.Body)
  60. if err != nil {
  61. return obj, err
  62. }
  63. if isDebug {
  64. core.Log.Infof("post请求:请求:%s data:%s 返回:%s", uri, data, body)
  65. }
  66. err = json.Unmarshal(body, &obj)
  67. return obj, err
  68. }
  69. // signMd5 md5签名
  70. func signMd5(req map[string]interface{}) string {
  71. keys := make([]string, 0, len(req))
  72. for k := range req {
  73. if k == "sign" {
  74. continue
  75. }
  76. keys = append(keys, k)
  77. }
  78. sort.Strings(keys)
  79. // 拼接键值对
  80. var sb strings.Builder
  81. for _, k := range keys {
  82. if gocast.ToString(req[k]) == "" {
  83. continue
  84. }
  85. sb.WriteString(fmt.Sprintf("%s%s", k, gocast.ToString(req[k])))
  86. }
  87. // 计算 MD5 哈希
  88. str := fmt.Sprintf("%s%s", sb.String(), conf().Secret)
  89. hash := md5.Sum([]byte(str))
  90. core.Log.Infof("sb:%s secret:%s str:%s sign str:%s", sb.String(), conf().Secret, str, hex.EncodeToString(hash[:]))
  91. // 将哈希值转换为十六进制字符串
  92. return hex.EncodeToString(hash[:])
  93. }
  94. // 将结构体转换为 JSON map
  95. func structToJSONMap(obj interface{}) (map[string]interface{}, error) {
  96. // 将结构体编码为 JSON
  97. data, err := json.Marshal(obj)
  98. if err != nil {
  99. return nil, err
  100. }
  101. // 定义一个 map 用于存储 JSON 数据
  102. var result map[string]interface{}
  103. // 将 JSON 解码到 map 中
  104. err = json.Unmarshal(data, &result)
  105. if err != nil {
  106. return nil, err
  107. }
  108. return result, nil
  109. }