【GoCN酷Go推荐】灵活的Go http client库-Sling
GoCN
共 2536字,需浏览 6分钟
·
2021-06-02 23:46
推荐理由
功能介绍
支持GET/POST/PUT/PATCH/DELETE/HEAD 基于Base/Path可以扩展和复用Sling query参数可以用结构体来Encode Request Body支持form和json 可将Json格式的Response直接Decode到定义好的结构体 可扩展Response的Decoder,以及Doer。
使用指南
Sling对http请求的要素method、baseUrl、Path、query、body、request、response等做了封装,基本使用可以参考https://github.com/dghubble/sling 上的示例代码。
可以通过实现ResponseDecoder和Doer的接口,来定制响应的decoder和发送请求的具体实现。
利用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 大会哦~
评论