Go 实战:封装通用 API 客户端

AI摘要
本文分享了在Go项目中封装通用API客户端以统一处理第三方接口调用的实践经验。作者通过定义Client结构体、基础请求方法和增加重试与日志功能,解决了直接调用导致的代码重复和维护问题,并建议未来可扩展支持context、header注入和限流控制。属于技术性的知识分享。

在 Go 项目中,我们经常会对接各种第三方接口,例如数据统计、消息推送等。起初,每个接口调用都直接写在业务逻辑中,随着项目规模变大,这种方式会带来维护成本和重复代码问题。于是我尝试封装一个通用 API 客户端,用来统一处理请求、错误和日志。

首先是最基础的 Client 结构:

type Client struct {
    httpClient *http.Client
    baseURL    string
}

func NewClient(baseURL string, timeout time.Duration) *Client {
    return &Client{
        baseURL: baseURL,
        httpClient: &http.Client{
            Timeout: timeout,
        },
    }
}

然后提供统一的请求方法:

func (c *Client) Do(method, path string, body io.Reader) ([]byte, error) {
    req, err := http.NewRequest(method, c.baseURL+path, body)
    if err != nil {
        return nil, err
    }

    resp, err := c.httpClient.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    return io.ReadAll(resp.Body)
}

在此基础上可以加重试机制和统一日志处理:

func (c *Client) DoWithRetry(method, path string, body io.Reader, retry int) ([]byte, error) {
    var err error
    for i := 0; i < retry; i++ {
        data, err := c.Do(method, path, body)
        if err == nil {
            return data, nil
        }
        time.Sleep(time.Second)
    }
    return nil, err
}

通过这样的封装,接口调用变得可维护,出错时也容易定位。实际项目中,我也尝试过 对接一些第三方行情或统计 API,非常适合封装客户端进行批量请求。

最后,可以在此基础上考虑支持 context、header 注入、以及接口限流控制,这样客户端就可以适应大部分项目需求。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!