package api import ( "bytes" "encoding/json" "fmt" "net/http" "net/url" "sentinel/pkg/model" "time" "sentinel/pkg/config" "sentinel/pkg/log" ) var client = &http.Client{ Timeout: 5 * time.Second, } func Get(path string, query map[string]string, out any) error { return do(http.MethodGet, path, query, nil, out) } func Post(path string, body any, out any) error { return do(http.MethodPost, path, nil, body, out) } func do(method, path string, query map[string]string, body any, out any) error { u, err := url.Parse(config.BASE_URL + path) if err != nil { log.Error("parse url failed: " + err.Error()) return err } if len(query) > 0 { q := u.Query() for k, v := range query { q.Set(k, v) } u.RawQuery = q.Encode() } var reqBody *bytes.Reader if body != nil { b, err := json.Marshal(body) if err != nil { log.Error("marshal body failed: " + err.Error()) return err } reqBody = bytes.NewReader(b) } else { reqBody = bytes.NewReader(nil) } req, err := http.NewRequest(method, u.String(), reqBody) if err != nil { log.Error("create request failed: " + err.Error()) return err } req.Header.Set("Content-Type", "application/json") req.Header.Set("apikey", "NzusyzcLIUoZ22tflHN2sOjHrry3W7zJ") resp, err := client.Do(req) if err != nil { log.Error("request failed: " + err.Error()) return err } defer resp.Body.Close() if resp.StatusCode < 200 || resp.StatusCode >= 300 { log.Error("http status error: " + resp.Status) return fmt.Errorf("http status %d", resp.StatusCode) } // 解析成 BaseResponse var baseResp model.BaseResponse if err := json.NewDecoder(resp.Body).Decode(&baseResp); err != nil { log.Error("decode base response failed: " + err.Error()) return err } if !baseResp.Status { log.Error("server returned error: " + baseResp.Message) return fmt.Errorf(baseResp.Message) } if out != nil && baseResp.Data != nil { // 将 Data 转成业务类型 b, err := json.Marshal(baseResp.Data) if err != nil { log.Error("marshal data failed: " + err.Error()) return err } if err := json.Unmarshal(b, out); err != nil { log.Error("unmarshal data to out failed: " + err.Error()) return err } } return nil }