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

共 2536字,需浏览 6分钟

 ·

2021-06-02 23:46

推荐理由

目开发中,发送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接口来扩展个性化的场景。

参考资料


  • https://github.com/dghubble/sling


还想了解更多吗?

更多请查看:https://github.com/dghubble/sling

欢迎加入我们GOLANG中国社区:https://gocn.vip/


《酷Go推荐》招募:


各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到

新的库,并且知道怎么用。


大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!(报名地址:https://wj.qq.com/s2/7734329/3f51)


扫码也可以加入 GoCN 的大家族哟~


 Gopher China2021大会日程详情来了!


点击阅读原文,还有机会获得门票参加 Gopher China 大会哦~

浏览 87
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报