Go 实战:封装通用 API 客户端
在 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 协议》,转载必须注明作者和本文链接
learnnnn 的个人博客
关于 LearnKu