bash_go_service/shared/pkg/client/client.go

231 lines
4.8 KiB
Go

package client
import (
"bytes"
"encoding/json"
"io"
"net/http"
"net/url"
"path"
"bash_go_service/shared/pkg/constants"
"bash_go_service/shared/pkg/logger"
)
type Client struct {
baseURL string
client *http.Client
}
type ClientOption func(*Client)
func WithBaseURL(baseURL string) ClientOption {
return func(c *Client) {
if baseURL != "" {
c.baseURL = baseURL
}
}
}
func NewClient(opts ...ClientOption) *Client {
client := &Client{
baseURL: constants.BaseUrl, // 默认使用环境变量
client: &http.Client{
Timeout: constants.ClientTimeout,
},
}
// 应用可选参数
for _, opt := range opts {
opt(client)
}
return client
}
func (c *Client) Get(uri string, query map[string]string, result interface{}) error {
// 构建URL
u, err := url.Parse(c.baseURL)
if err != nil {
logger.ErrorLogger.Printf("Failed to parse base URL: %v", err)
return err
}
u.Path = path.Join(u.Path, uri)
// 添加query参数
q := u.Query()
for k, v := range query {
q.Set(k, v)
}
u.RawQuery = q.Encode()
// 发送请求
resp, err := c.client.Get(u.String())
if err != nil {
logger.ErrorLogger.Printf("GET request failed: %v", err)
return err
}
defer resp.Body.Close()
// 读取响应
body, err := io.ReadAll(resp.Body)
if err != nil {
logger.ErrorLogger.Printf("Failed to read response body: %v", err)
return err
}
// 解析JSON
if err := json.Unmarshal(body, result); err != nil {
logger.ErrorLogger.Printf("Failed to unmarshal response: %v", err)
return err
}
return nil
}
func (c *Client) Post(uri string, body interface{}, query map[string]string, result interface{}) error {
// 构建URL
u, err := url.Parse(c.baseURL)
if err != nil {
logger.ErrorLogger.Printf("Failed to parse base URL: %v", err)
return err
}
u.Path = path.Join(u.Path, uri)
// 添加query参数(如果有)
if query != nil {
q := u.Query()
for k, v := range query {
q.Set(k, v)
}
u.RawQuery = q.Encode()
}
// 序列化请求体
payload, err := json.Marshal(body)
if err != nil {
logger.ErrorLogger.Printf("Failed to marshal request body: %v", err)
return err
}
// 发送请求
resp, err := c.client.Post(u.String(), "application/json", bytes.NewBuffer(payload))
if err != nil {
logger.ErrorLogger.Printf("POST request failed: %v", err)
return err
}
defer resp.Body.Close()
// 读取响应
respBody, err := io.ReadAll(resp.Body)
logger.DebugLogger.Printf("Response body: %s", string(respBody))
if err != nil {
logger.ErrorLogger.Printf("Failed to read response body: %v", err)
return err
}
// 解析JSON
if err := json.Unmarshal(respBody, result); err != nil {
logger.ErrorLogger.Printf("Failed to unmarshal response: %v", err)
return err
}
return nil
}
func (c *Client) Put(uri string, body interface{}, query map[string]string, result interface{}) error {
u, err := url.Parse(c.baseURL)
if err != nil {
logger.ErrorLogger.Printf("Failed to parse base URL: %v", err)
return err
}
u.Path = path.Join(u.Path, uri)
if query != nil {
q := u.Query()
for k, v := range query {
q.Set(k, v)
}
u.RawQuery = q.Encode()
}
payload, err := json.Marshal(body)
if err != nil {
logger.ErrorLogger.Printf("Failed to marshal request body: %v", err)
return err
}
req, err := http.NewRequest(http.MethodPut, u.String(), bytes.NewBuffer(payload))
if err != nil {
logger.ErrorLogger.Printf("Failed to create PUT request: %v", err)
return err
}
req.Header.Set("Content-Type", "application/json")
resp, err := c.client.Do(req)
if err != nil {
logger.ErrorLogger.Printf("PUT request failed: %v", err)
return err
}
defer resp.Body.Close()
respBody, err := io.ReadAll(resp.Body)
if err != nil {
logger.ErrorLogger.Printf("Failed to read response body: %v", err)
return err
}
if err := json.Unmarshal(respBody, result); err != nil {
logger.ErrorLogger.Printf("Failed to unmarshal response: %v", err)
return err
}
return nil
}
func (c *Client) Delete(uri string, query map[string]string, result interface{}) error {
u, err := url.Parse(c.baseURL)
if err != nil {
logger.ErrorLogger.Printf("Failed to parse base URL: %v", err)
return err
}
u.Path = path.Join(u.Path, uri)
if query != nil {
q := u.Query()
for k, v := range query {
q.Set(k, v)
}
u.RawQuery = q.Encode()
}
req, err := http.NewRequest(http.MethodDelete, u.String(), nil)
if err != nil {
logger.ErrorLogger.Printf("Failed to create DELETE request: %v", err)
return err
}
resp, err := c.client.Do(req)
if err != nil {
logger.ErrorLogger.Printf("DELETE request failed: %v", err)
return err
}
defer resp.Body.Close()
respBody, err := io.ReadAll(resp.Body)
if err != nil {
logger.ErrorLogger.Printf("Failed to read response body: %v", err)
return err
}
if err := json.Unmarshal(respBody, result); err != nil {
logger.ErrorLogger.Printf("Failed to unmarshal response: %v", err)
return err
}
return nil
}