85 lines
2.3 KiB
Go
85 lines
2.3 KiB
Go
// 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
|
|
}
|