酷Go推荐 灵活的 Go http client 库-Sling

wentao · 2021年05月28日 · 199 次阅读

推荐理由

项目开发中,发送 http 请求的场景,推荐使用 Sling 库。Sling 本身是基于 net/http 来处理发送请求,同时做了较好的封装,既可以利用 net/http 的一些特性(如:httptrace),同时又不必关心 net/http 库的一些琐碎细节。

功能介绍

Sling 支持以下主要的功能:

  • 支持 GET/POST/PUT/PATCH/DELETE/HEAD
  • 基于 Base/Path 可以扩展和复用 Sling
  • query 参数可以用结构体来 Encode
  • Request Body 支持 form 和 json
  • 可将 Json 格式的 Response 直接 Decode 到定义好的结构体
  • 可扩展 Response 的 Decoder,以及 Doer。

使用指南

  1. Sling 对 http 请求的要素 method、baseUrl、Path、query、body、request、response 等做了封装,基本使用可以参考https://github.com/dghubble/sling 上的示例代码。

  2. 可以通过实现 ResponseDecoder 和 Doer 的接口,来定制响应的 decoder 和发送请求的具体实现。

  3. 利用 Sling 灵活扩展的特性提高业务代码复用,可以参考下面的示例:

const baseURL = "https://api.github.com/"

// Github Issue (abbreviated)
type Issue struct {
    Title  string `json:"title"`
    Body   string `json:"body"`
}

type IssueService struct {
    sling *sling.Sling
}

func NewIssueService(httpClient *http.Client) *IssueService {
    return &IssueService{
        sling: sling.New().Client(httpClient).Base(baseURL),
    }
}

func (s *IssueService) ListByRepo(owner, repo string, params *IssueListParams) ([]Issue, *http.Response, error) {
    issues := new([]Issue)
    githubError := new(GithubError)
    path := fmt.Sprintf("repos/%s/%s/issues", owner, repo)
    // 注意此处一定要调用New方法来clone一个sling实例
    resp, err := s.sling.New().Get(path).QueryStruct(params).Receive(issues, githubError)
    if err == nil {
        err = githubError
    }
    return *issues, resp, err
}

总结

Sling 的默认实现可以覆盖大部分对于 http 发送请求场景,同时可以通过实现 Doer 和 ResponseDecoder 接口来扩展个性化的场景。

参考资料

  1. https://github.com/dghubble/sling
更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册