http.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package main
  2. import (
  3. "encoding/json"
  4. "io"
  5. "net/http"
  6. "time"
  7. )
  8. // Response 是顶层响应结构
  9. type Response struct {
  10. Code string `json:"code"`
  11. Data []SDData `json:"data"`
  12. }
  13. // SDData 是数据项结构
  14. type SDData struct {
  15. Key string `json:"SD_Key"`
  16. Addr string `json:"SD_Addr"`
  17. Code string `json:"SD_Code"`
  18. Name string `json:"SD_Name"`
  19. Unit string `json:"SD_Unit"` // null值可以用空字符串处理
  20. Data string `json:"SD_Data"`
  21. Time string `json:"SD_Time"`
  22. }
  23. // FetchAndParseData 从URL获取数据并解析
  24. func FetchAndParseData(url string) (*Response, error) {
  25. // 创建HTTP客户端,设置超时
  26. client := &http.Client{
  27. Timeout: 10 * time.Second,
  28. }
  29. // 发送GET请求
  30. resp, err := client.Get(url)
  31. if err != nil {
  32. log.Errorf("HTTP请求失败: %v", err)
  33. return nil, err
  34. }
  35. defer resp.Body.Close()
  36. // 检查状态码
  37. if resp.StatusCode != http.StatusOK {
  38. log.Errorf("HTTP状态码错误: %d", resp.StatusCode)
  39. return nil, err
  40. }
  41. // 读取响应体
  42. body, err := io.ReadAll(resp.Body)
  43. if err != nil {
  44. log.Errorf("读取响应失败: %v", err)
  45. return nil, err
  46. }
  47. // 解析JSON
  48. var data Response
  49. err = json.Unmarshal(body, &data)
  50. if err != nil {
  51. log.Errorf("JSON解析失败: %v", err)
  52. return nil, err
  53. }
  54. return &data, nil
  55. }