// Package network define struct of network operation package network import ( "fmt" "io" "net/http" "strings" "github.com/bitly/go-simplejson" ) // APIEndpoint defines an api endpoint struct to poll data from dataRT service type APIEndpoint struct { URL string `json:"url"` Method string `json:"method"` // HTTP 方法,如 "GET", "POST" Headers map[string]string `json:"headers"` QueryParams map[string]string `json:"query_params"` Body string `json:"body"` // 对于 POST 请求需要一个请求体 Interval int `json:"interval"` // 轮询间隔时间(秒) } // fetchAPI defines execute http request and return response or error func fetchAPI(endpoint APIEndpoint) (string, error) { client := &http.Client{} req, err := http.NewRequest(endpoint.Method, endpoint.URL, nil) if err != nil { return "", err } for key, value := range endpoint.Headers { req.Header.Set(key, value) } query := req.URL.Query() for key, value := range endpoint.QueryParams { query.Set(key, value) } req.URL.RawQuery = query.Encode() if endpoint.Method == "POST" || endpoint.Method == "PUT" { req.Body = io.NopCloser(strings.NewReader(endpoint.Body)) req.Header.Set("Content-Type", "application/json") } resp, err := client.Do(req) if err != nil { return "", err } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { return "", err } return string(body), nil } // PollAPIEndpoints defines unmarshal polling data from http request func PollAPIEndpoints(endpoint APIEndpoint) ([]float64, error) { var valueSlice []float64 respStr, err := fetchAPI(endpoint) if err != nil { return valueSlice, fmt.Errorf("fetch api failed:%w", err) } realDataJSON, err := simplejson.NewJson([]byte(respStr)) if err != nil { return valueSlice, fmt.Errorf("format real time data failed:%w", err) } simplejson.New().UnmarshalJSON([]byte(respStr)) code := realDataJSON.Get("code").MustInt() if code != 0 { return valueSlice, fmt.Errorf("polling data api status error:%s", realDataJSON.Get("msg").MustString()) } dataLen := len(realDataJSON.Get("data").MustArray()) for i := 0; i < dataLen; i++ { valueSlice = append(valueSlice, realDataJSON.Get("data").GetIndex(i).Get("value").MustFloat64()) } return valueSlice, nil }