| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- package main
- import (
- "encoding/json"
- "io"
- "net/http"
- "time"
- )
- // Response 是顶层响应结构
- type Response struct {
- Code string `json:"code"`
- Data []SDData `json:"data"`
- }
- // SDData 是数据项结构
- type SDData struct {
- Key string `json:"SD_Key"`
- Addr string `json:"SD_Addr"`
- Code string `json:"SD_Code"`
- Name string `json:"SD_Name"`
- Unit string `json:"SD_Unit"` // null值可以用空字符串处理
- Data string `json:"SD_Data"`
- Time string `json:"SD_Time"`
- }
- // FetchAndParseData 从URL获取数据并解析
- func FetchAndParseData(url string) (*Response, error) {
- // 创建HTTP客户端,设置超时
- client := &http.Client{
- Timeout: 10 * time.Second,
- }
- // 发送GET请求
- resp, err := client.Get(url)
- if err != nil {
- log.Errorf("HTTP请求失败: %v", err)
- return nil, err
- }
- defer resp.Body.Close()
- // 检查状态码
- if resp.StatusCode != http.StatusOK {
- log.Errorf("HTTP状态码错误: %d", resp.StatusCode)
- return nil, err
- }
- // 读取响应体
- body, err := io.ReadAll(resp.Body)
- if err != nil {
- log.Errorf("读取响应失败: %v", err)
- return nil, err
- }
- // 解析JSON
- var data Response
- err = json.Unmarshal(body, &data)
- if err != nil {
- log.Errorf("JSON解析失败: %v", err)
- return nil, err
- }
- return &data, nil
- }
|