Go語言resty http包調用jenkins api實例

前言

在前兩篇文章中都使用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請求

該示例顯示請求狀態和響應耗時

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

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認證

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數據

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)
}

文件下載

定義下載保存路徑,直接下載

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頭,以及簡單認證

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的結構體,方便接下來的數據接收

type JobInfo struct {
   DisplayName string
   FullName string
   Buildable bool
   NextBuildNumber int
   InQueue bool
   Color string //blue成功 red失敗
   Url string
}

resty會將返回數據解碼,隻需要提供結構體接收

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請求,調用無參數構建

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次獲取日志內容

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名稱,第二個參數設定開關值

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的資料請關註WalkonNet其它相關文章!

推薦閱讀: