使用Go從GitHub獲取存儲庫列表

在本文中,我將僅使用Go來詢問有關公共存儲庫的GitHub API信息。net/httpstdlib軟件包,沒有任何其他庫。

GitHub有一個不錯的公共API,稱為Search,您可以在以下位置進行檢查https://developer.github.com/v3/search/#search-repositories

我特別感興趣獲得超過1萬顆星的Go存儲庫在這個時間點。

我們可以向其傳遞查詢以獲取所需的確切信息。查看Search API文檔,我們將必鬚髮出HTTP GET請求以https://api.github.com/search/repositories傳遞查詢?q=stars:>=10000+language:go&sort=stars&order=desc:為我提供超過1萬顆星的存儲庫,使用Go語言,請按星數對它們進行排序。

最簡單的代碼段:我們使用http.Getnet/http我們閱讀了使用返回的所有內容ioutil.ReadAll

package main

import ( “io/ioutil” “log” “net/http” )

func main() { res, err := http.Get(https://api.github.com/search/repositories?q=stars:>=10000+language:go&sort=stars&order=desc”)

<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
	<span style="color:#a6e22e">log</span>.<span style="color:#a6e22e">Fatal</span>(<span style="color:#a6e22e">err</span>)
}

<span style="color:#a6e22e">body</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">ioutil</span>.<span style="color:#a6e22e">ReadAll</span>(<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">Body</span>)
<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">Body</span>.<span style="color:#a6e22e">Close</span>()
<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
	<span style="color:#a6e22e">log</span>.<span style="color:#a6e22e">Fatal</span>(<span style="color:#a6e22e">err</span>)
}
<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">StatusCode</span> <span style="color:#f92672">!=</span> <span style="color:#ae81ff">200</span> {
	<span style="color:#a6e22e">log</span>.<span style="color:#a6e22e">Fatal</span>(<span style="color:#e6db74">"Unexpected status code"</span>, <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">StatusCode</span>)
}

<span style="color:#a6e22e">log</span>.<span style="color:#a6e22e">Printf</span>(<span style="color:#e6db74">"Body: %s\n"</span>, <span style="color:#a6e22e">body</span>)

}

它是可讀性不強, 如你看到的。您可以粘貼使用的內容在線格式化程序了解實際結構。

現在讓我們處理JSON並從中生成一個漂亮的表。

如果您不熟悉JSON主題,請參閱有關以下內容的初步指南:如何使用Go處理JSON

package main

import ( “encoding/json” “fmt” “io/ioutil” “log” “net/http” “os” “text/tabwriter” “time” )

// Owner is the repository owner type Owner struct { Login string }

// Item is the single repository data structure type Item struct { ID int Name string FullName string json:"full_name" Owner Owner Description string CreatedAt string json:"created_at" StargazersCount int json:"stargazers_count" }

// JSONData contains the GitHub API response type JSONData struct { Count int json:"total_count" Items []Item }

func main() { res, err := http.Get(https://api.github.com/search/repositories?q=stars:>=10000+language:go&sort=stars&order=desc”) if err != nil { log.Fatal(err) } body, err := ioutil.ReadAll(res.Body) res.Body.Close() if err != nil { log.Fatal(err) } if res.StatusCode != http.StatusOK { log.Fatal(“Unexpected status code”, res.StatusCode) } data := JSONData{} err = json.Unmarshal(body, &data) if err != nil { log.Fatal(err) } printData(data) }

func printData(data JSONData) { log.Printf(“Repositories found: %d”, data.Count) const format = “%v\t%v\t%v\t%v\t\n” tw := new(tabwriter.Writer).Init(os.Stdout, 0, 8, 2, ’ ', 0) fmt.Fprintf(tw, format, “Repository”, “Stars”, “Created at”, “Description”) fmt.Fprintf(tw, format, “----------”, “-----”, “----------”, “----------”) for _, i := range data.Items { desc := i.Description if len(desc) > 50 { desc = string(desc[:50]) + “…” } t, err := time.Parse(time.RFC3339, i.CreatedAt) if err != nil { log.Fatal(err) } fmt.Fprintf(tw, format, i.FullName, i.StargazersCount, t.Year(), desc) } tw.Flush() }

上面的代碼創建了3個結構以解組GitHub提供的JSON。JSONData是主要的容器Items是一片Item,存儲庫結構和內部項目,Owner包含存儲庫所有者數據。

給出HTTP響應res由...返回http.Get我們使用提取身體res.Body我們讀了所有bodyioutil.ReadAll

檢查後res.StatusCode符合http.StatusOK常數(對應於200),我們使用來解組JSONjson.Unmarshal進入我們的JSONData結構data,然後將其傳遞給我們進行打印printData結構。

裡面printData我實例化一個tabwriter.Writer,然後相應地處理和格式化JSON數據,以輸出漂亮的表佈局:


更多教程: