Goを使用して、GitHubからリポジトリのリストを取得します

この投稿では、Goだけを使用して、パブリックリポジトリに関する情報をGitHubAPIに要求します。net/http追加のライブラリなしのstdlibパッケージ。

GitHubには、Searchと呼ばれる優れたパブリックAPIがあり、次の場所で調べることができます。https://developer.github.com/v3/search/#search-repositories

特に興味があります10k以上の星を含むGoレポを取得するこの時点で。

クエリを渡して、必要なものを正確に取得できます。 Search APIのドキュメントを見ると、HTTPGETリクエストを行う必要があります。https://api.github.com/search/repositoriesクエリを渡す?q=stars:>=10000+language:go&sort=stars&order=desc:1万個以上の星があり、言語がGoのリポジトリを教えてください。星の数で並べ替えてください。

最も単純なスニペット:使用するhttp.Getからnet/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() }

上記のコードは、GitHubによって提供されるJSONをアンマーシャリングするための3つの構造体を作成します。JSONDataメインコンテナです、ItemsのスライスですItem、リポジトリ構造体、および内部アイテム、Ownerリポジトリ所有者データが含まれています。

HTTP応答が与えられたresによって返されるhttp.Getを使用して体を抽出しますres.Bodyそして私達はそれのすべてをbodyioutil.ReadAll

確認後res.StatusCode一致しますhttp.StatusOK定数(これはに対応します200)、を使用してJSONをアンマーシャリングしますjson.Unmarshal私たちにJSONData構造体data、そして私たちはそれを私たちに渡すことによってそれを印刷しますprintData構造体。

内部printData私はインスタンス化しますtabwriter.Writer次に、それに応じてJSONデータを処理およびフォーマットして、適切なテーブルレイアウトを出力します。


その他のチュートリアル: