版本封存

This commit is contained in:
zeaslity
2025-12-06 11:26:05 +08:00
parent 13949e1ba8
commit c0ae5e30c4
57 changed files with 2443 additions and 1428 deletions

View File

@@ -8,6 +8,7 @@ import (
"fmt"
"io"
"net/http"
"strings"
"time"
"cmii-uav-watchdog-common/models"
@@ -23,7 +24,8 @@ var (
)
const (
DefaultHeartbeatURL = "http://cmii-uav-watchdog/heartbeat"
DefaultHeartbeatURL = "http://cmii-uav-watchdog:8080/api/heartbeat"
// DefaultHeartbeatURL = "http://192.168.35.70:8990/api/heartbeat"
)
// ClientOptions HTTP客户端配置选项
@@ -48,8 +50,9 @@ func DefaultClientOptions() *ClientOptions {
// Client HTTP客户端封装
type Client struct {
httpClient *http.Client
options *ClientOptions
httpClient *http.Client
options *ClientOptions
heartbeatURL string // 心跳请求的URL地址
}
// NewClient 创建一个新的HTTP客户端
@@ -58,7 +61,7 @@ type Client struct {
//
// 返回:
// - *Client: HTTP客户端实例
func NewClient(options *ClientOptions) *Client {
func NewClient(options *ClientOptions, heartbeatURL string) *Client {
if options == nil {
options = DefaultClientOptions()
}
@@ -75,10 +78,22 @@ func NewClient(options *ClientOptions) *Client {
Transport: transport,
}
return &Client{
httpClient: httpClient,
options: options,
// 解析heartbeatURL
heartbeatURL = strings.TrimSpace(heartbeatURL)
if heartbeatURL == "" {
heartbeatURL = DefaultHeartbeatURL
}
return &Client{
httpClient: httpClient,
options: options,
heartbeatURL: heartbeatURL,
}
}
// GetHeartbeatURL 获取心跳请求的URL地址
func (c *Client) GetHeartbeatURL() string {
return c.heartbeatURL
}
// SendHeartbeat 发送心跳请求并处理响应
@@ -114,7 +129,7 @@ func (c *Client) SendHeartbeat(ctx context.Context, request *models.HeartbeatReq
}
// 创建HTTP请求
req, err := http.NewRequestWithContext(ctx, http.MethodPost, DefaultHeartbeatURL, bytes.NewBuffer(requestBody))
req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.heartbeatURL, bytes.NewBuffer(requestBody))
if err != nil {
lastError = fmt.Errorf("创建请求失败: %w", err)
continue
@@ -140,9 +155,37 @@ func (c *Client) SendHeartbeat(ctx context.Context, request *models.HeartbeatReq
// 确保响应体被关闭
defer resp.Body.Close()
// 检查HTTP状态码
if resp.StatusCode != http.StatusOK {
lastError = fmt.Errorf("%w: 状态码 %d", ErrInvalidStatusCode, resp.StatusCode)
// 使用switch检查HTTP状态码
switch resp.StatusCode {
case http.StatusOK:
// 状态码为200继续处理响应
case http.StatusBadRequest:
lastError = fmt.Errorf("%w: 状态码 %d请求无效", ErrInvalidStatusCode, resp.StatusCode)
// 读取并丢弃响应体,避免连接泄漏
_, _ = io.Copy(io.Discard, resp.Body)
continue
case http.StatusUnauthorized:
lastError = fmt.Errorf("%w: 状态码 %d未授权", ErrInvalidStatusCode, resp.StatusCode)
// 读取并丢弃响应体,避免连接泄漏
_, _ = io.Copy(io.Discard, resp.Body)
continue
case http.StatusForbidden:
lastError = fmt.Errorf("%w: 状态码 %d禁止访问", ErrInvalidStatusCode, resp.StatusCode)
// 读取并丢弃响应体,避免连接泄漏
_, _ = io.Copy(io.Discard, resp.Body)
continue
case http.StatusNotFound:
lastError = fmt.Errorf("%w: 状态码 %d未找到资源", ErrInvalidStatusCode, resp.StatusCode)
// 读取并丢弃响应体,避免连接泄漏
_, _ = io.Copy(io.Discard, resp.Body)
continue
case http.StatusInternalServerError:
lastError = fmt.Errorf("%w: 状态码 %d服务器内部错误", ErrInvalidStatusCode, resp.StatusCode)
// 读取并丢弃响应体,避免连接泄漏
_, _ = io.Copy(io.Discard, resp.Body)
continue
default:
lastError = fmt.Errorf("%w: 状态码 %d未知错误", ErrInvalidStatusCode, resp.StatusCode)
// 读取并丢弃响应体,避免连接泄漏
_, _ = io.Copy(io.Discard, resp.Body)
continue