前言
在前两篇文章中都使用HttpRequest这个http包来做api的请求
然后github上面还有一个更有名,星星更多,社区也更活跃的http包Resty
最近11月3号又发布了一个新版本,项目参与者多达75个,标星有5.2k
Resty特色
- 支持GET, POST, PUT, DELETE, HEAD, PATCH, OPTIONS等方法
- 设置和请求的方法简单
- 请求体支持多种数据类型(string,[]byte,struct,map,slice,io.Reader)
- 返回支持[]byte和string
- 对json和xml内容自动编码和解码
- 支持上传一个多个文件和下载指定路径或打包
- 请求参数支持QueryParams,QueryString,FormData
- 支持重试,代理,证书
- 支持简单认证和认证token
Resty官网: https://github.com/go-resty/resty
演示例子
演示部分例子get,post等例子,其它put,delete,patch都差不多
简单get请求
该示例显示请求状态和响应耗时
1
2
3
4
5
6
|
func simpleGet() { client := resty. New () resp, _ := client.R().EnableTrace().Get( "https://httpbin.org/get" ) fmt. Println ( "状态码:" , resp.StatusCode()) fmt. Println ( "总耗时:" , resp.Time()) } |
增强get请求
该示例支持map类型和路径参数,支持设置请求头和认证token
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
func enhancedGet() { client := resty. New () resp, _ := client.R(). SetQueryParams( map [ string ] string { "page_no" : "1" , "limit" : "20" , "sort" : "name" , "order" : "asc" , "random" : strconv.FormatInt(time.Now().Unix(), 10 ), }). //SetQueryString("productId=232&template=fresh-sample&cat=resty&source=google&kw=buy a lot more"). SetHeader( "Accept" , "application/json" ). SetAuthToken( "xxxxxxxxxxxxxxxxxxxxxxx" ). Get( "/search_result" ) fmt. Println (resp) } |
灵活post请求
该示例支持设置body内容为map支持简单认证和token认证
1
2
3
4
5
6
7
8
|
func variousPost() { client := resty. New () resp, err := client.R(). SetBody( map [ string ] interface {}{ "username" : "testuser" , "password" : "testpass" }). SetAuthToken( "<your-auth-token>" ). Post( "https://myapp.com/login" ) fmt. Println (resp, err) } |
多文件上传
该示例支持多文件上传,支持定义本地文件路径,支持设置FormData数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
func multipartFileUpload() { profileImgBytes, _ := ioutil.ReadFile( "/Users/jeeva/test-img.png" ) notesBytes, _ := ioutil.ReadFile( "/Users/jeeva/text-file.txt" ) client := resty. New () resp, _ := client.R(). SetFileReader( "profile_img" , "test-img.png" , bytes.NewReader(profileImgBytes)). SetFileReader( "notes" , "text-file.txt" , bytes.NewReader(notesBytes)). SetFormData( map [ string ] string { "first_name" : "dddd" , "last_name" : "cccc" , }). Post( "http://myapp.com/upload" ) fmt. Println (resp) } |
文件下载
定义下载保存路径,直接下载
1
2
3
4
5
6
|
func downFile() { client := resty. New () _, _ = client.R(). SetOutput( "plugin/test-v5.1-beta.zip" ). Get( "http://my.app/test" ) } |
实战例子
通过上面的演示例子,可以看到resty这个包功能非常强大
接下来我们使用该包来封装jenkins api,来进行二次开发
构造一个jenkins客户端
编写一个方法创建jenkins客户端,后续所有动作只需调用既可
该客户端集成了重试,json头,以及简单认证
1
2
3
4
5
6
7
8
9
10
11
|
func jenkinsClient() *resty.Request { c := resty. New () a := c.SetRetryCount( 3 ).SetRetryWaitTime( 5 * time.Second). SetRetryMaxWaitTime( 20 * time.Second). R().SetHeader( "Accept" , "application/json" ). SetBasicAuth( "username" , "password" ) return a } var ( url = "http://ip:port" ) |
获取jenkins job信息
创建好jobinfo的结构体,方便接下来的数据接收
1
2
3
4
5
6
7
8
9
|
type JobInfo struct { DisplayName string FullName string Buildable bool NextBuildNumber int InQueue bool Color string //blue成功 red失败 Url string } |
resty会将返回数据解码,只需要提供结构体接收
1
2
3
4
5
6
7
8
9
10
|
func jenkinsJobInfo(job string ) { a := jenkinsClient() jobInfo := &JobInfo{} resp, err := a.SetResult(jobInfo).Get(url + "/job/" + job + "/api/json" ) if err != nil { fmt. Println (err) } fmt. Println ( "resp\n" , resp.StatusCode(), resp.Time()) fmt. Println (jobInfo.Color) } |
无参构建job
简单post请求,调用无参数构建
1
2
3
4
5
6
7
|
func jenkinsJobBuild(job string ) { a := jenkinsClient() resp, _ := a.Post(url+ "/job/" +job+ "/build" ) if resp.StatusCode() == 201 { fmt. Println ( "build 成功" ) } } |
查看构建日志
查看日志,需要先获取job的最后一次的buildID
所以这里发请2次请求,第1次获取buildID,第2次获取日志内容
1
2
3
4
5
6
7
8
9
|
func jenkinsJobLog(job string ) { a := jenkinsClient() resp, _ := a.Get(url + "/job/" + job + "/lastBuild/buildNumber" ) if resp.StatusCode() == 200 { lastBuild := resp. String () resp2, _ := a.Get(url + "/job/" + job + "/" + lastBuild + "/logText/progressiveText" ) fmt. Println (resp2. String ()) } } |
job开关(启用禁用job)
第一个参数为job名称,第二个参数设定开关值
1
2
3
4
5
6
7
8
9
10
|
func jenkinsJobSwich(job string ,swi bool ) { a := jenkinsClient() if swi { resp, _ := a.Post(url + "/job/" + job + "/enable" ) fmt. Println (resp.Status()) } else { resp, _ := a.Post(url + "/job/" + job + "/disable" ) fmt. Println (resp.Status()) } } |
小结
通过实战可以发现,在没有第三方sdk的时候,完全是可以自已通过使用http包,来进行http api项目的二次开发或封装
而resty则是Go http包中的王者
以上就是Go语言resty http包调用jenkins api实例的详细内容,更多关于Go resty http包调用jenkins api的资料请关注服务器之家其它相关文章!
原文链接:https://juejin.cn/post/7035800426293231653