package tianxingjuhe import ( "bytes" "encoding/json" "fmt" "io" "net/http" "net/url" "time" ) // Client 天行聚合API客户端 type Client struct { baseURL string key string client *http.Client } // Config 客户端配置 type Config struct { BaseURL string // API基础URL Key string // API密钥 Timeout int // 超时时间(秒) } // Response 通用API响应结构 type Response struct { Code int `json:"code"` // 状态码,200表示成功 Msg string `json:"msg"` // 返回说明 Result interface{} `json:"result"` // 返回结果集,具体内容根据接口而定 } // NewClient 创建新的客户端实例 func NewClient(config Config) (*Client, error) { if config.BaseURL == "" { return nil, fmt.Errorf("baseURL不能为空") } if config.Key == "" { return nil, fmt.Errorf("key不能为空") } return &Client{ baseURL: config.BaseURL, key: config.Key, client: &http.Client{ Timeout: time.Duration(config.Timeout) * time.Second, }, }, nil } // Get 发送GET请求 func (c *Client) Get(endpoint string, params map[string]interface{}) (*Response, error) { // 构建完整URL fullURL := fmt.Sprintf("%s/%s", c.baseURL, endpoint) // 添加请求参数 queryParams := url.Values{} for key, value := range params { queryParams.Set(key, fmt.Sprintf("%v", value)) } // 添加key参数 queryParams.Set("key", c.key) // 拼接查询参数 if len(queryParams) > 0 { fullURL = fmt.Sprintf("%s?%s", fullURL, queryParams.Encode()) } // 创建HTTP请求 req, err := http.NewRequest("GET", fullURL, nil) if err != nil { return nil, fmt.Errorf("创建HTTP请求失败: %v", err) } // 设置请求头 req.Header.Set("Content-Type", "application/json") req.Header.Set("User-Agent", "Tianxingjuhe-Go-SDK/1.0.0") // 发送请求 resp, err := c.client.Do(req) if err != nil { return nil, fmt.Errorf("发送HTTP请求失败: %v", err) } defer resp.Body.Close() // 读取响应 body, err := io.ReadAll(resp.Body) if err != nil { return nil, fmt.Errorf("读取响应失败: %v", err) } // 解析响应 var apiResp Response if err := json.Unmarshal(body, &apiResp); err != nil { return nil, fmt.Errorf("解析响应失败: %v, 响应内容: %s", err, string(body)) } return &apiResp, nil } // Post 发送POST请求 func (c *Client) Post(endpoint string, params map[string]interface{}) (*Response, error) { // 构建完整URL fullURL := fmt.Sprintf("%s/%s", c.baseURL, endpoint) // 添加key参数 if params == nil { params = make(map[string]interface{}) } params["key"] = c.key // 序列化请求体 requestBody, err := json.Marshal(params) if err != nil { return nil, fmt.Errorf("序列化请求体失败: %v", err) } // 创建HTTP请求 req, err := http.NewRequest("POST", fullURL, bytes.NewBuffer(requestBody)) if err != nil { return nil, fmt.Errorf("创建HTTP请求失败: %v", err) } // 设置请求头 req.Header.Set("Content-Type", "application/json") req.Header.Set("User-Agent", "Tianxingjuhe-Go-SDK/1.0.0") // 发送请求 resp, err := c.client.Do(req) if err != nil { return nil, fmt.Errorf("发送HTTP请求失败: %v", err) } defer resp.Body.Close() // 读取响应 body, err := io.ReadAll(resp.Body) if err != nil { return nil, fmt.Errorf("读取响应失败: %v", err) } // 解析响应 var apiResp Response if err := json.Unmarshal(body, &apiResp); err != nil { return nil, fmt.Errorf("解析响应失败: %v, 响应内容: %s", err, string(body)) } return &apiResp, nil }