Sử dụng Go để lấy danh sách các kho từ GitHub

Trong bài đăng này, tôi sẽ hỏi thông tin API GitHub về các kho lưu trữ công khai, chỉ sử dụng Gonet/httpgói stdlib, không có bất kỳ thư viện bổ sung nào.

GitHub có một API công khai tuyệt vời được gọi là Tìm kiếm, bạn có thể kiểm tra tạihttps://developer.github.com/v3/search/#search-repositories.

Đặc biệt, tôi quan tâm đếnnhận đại diện cờ vây với hơn 10 nghìn saotại thời điểm này.

Chúng tôi có thể chuyển nó một truy vấn để nhận được chính xác những gì chúng tôi muốn. Xem xét tài liệu API Tìm kiếm, chúng tôi sẽ phải thực hiện yêu cầu HTTP GET đểhttps://api.github.com/search/repositorieschuyển truy vấn?q=stars:>=10000+language:go&sort=stars&order=desc: cung cấp cho tôi kho lưu trữ với hơn 10k sao, với ngôn ngữ Go, sắp xếp chúng theo số sao.

Đoạn mã đơn giản nhất: chúng tôi sử dụnghttp.Gettừnet/httpvà chúng tôi đọc mọi thứ được trả lại bằng cách sử dụngioutil.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>)

}

nó làkhông đọc được nhiều, bạn có thể thấy. Bạn có thể dán những gì bạn nhận được bằng cách sử dụngmột công cụ định dạng trực tuyếnđể hiểu cấu trúc thực tế.

Bây giờ chúng ta hãy xử lý JSON và tạo một bảng đẹp từ nó.

Nếu bạn chưa quen với chủ đề JSON, hãy xem hướng dẫn sơ bộ của tôi vềcách xử lý JSON với Go.

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

Đoạn mã trên tạo 3 cấu trúc để bỏ quản lý JSON do GitHub cung cấp.JSONDatalà thùng chứa chính,Itemslà một phần củaItem, cấu trúc kho lưu trữ và mục bên trong,Ownerchứa dữ liệu chủ sở hữu kho lưu trữ.

Đưa ra phản hồi HTTPrestrả lại bởihttp.Getchúng tôi trích xuất cơ thể bằng cách sử dụngres.Bodyvà chúng tôi đọc tất cả trongbodyvớiioutil.ReadAll.

Sau khi kiểm trares.StatusCodephù hợp vớihttp.StatusOKhằng số (tương ứng với200), chúng tôi bỏ quản lý JSON bằng cách sử dụngjson.Unmarshalvào của chúng tôiJSONDatacấu trúcdatavà chúng tôi in nó bằng cách chuyển nó choprintDatacấu trúc.

Phía trongprintDataTôi tạo mộttabwriter.Writer, sau đó xử lý và định dạng dữ liệu JSON cho phù hợp để xuất ra một bố cục bảng đẹp mắt:


Các hướng dẫn về go khác: