Files
AILab/sentinel/pkg/net/httpclient.go
T
2025-12-29 16:30:55 +08:00

102 lines
2.1 KiB
Go

package api
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"net/url"
"sentinel/pkg/model"
"time"
"sentinel/pkg/log"
)
const baseURL = "http://127.0.0.1:13011"
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(baseURL + 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")
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
}