Go: GitLab API の使い方

トークンとプロジェクトID の設定

```text:.env
PERSONAL_ACCESS_TOKEN=glpat-xxxxxx
PROJECT_ID="35195199"
```

## プロジェクトのメンバーの取得 ##

```go:get_member.go
// ---------------------------------------------------------------
//
//	get_members.go
//
//					May/07/2022
// ---------------------------------------------------------------
package main

import (
	"os"
	"fmt"
	"io/ioutil"
	"net/http"
	"encoding/json"
	"github.com/joho/godotenv"
)

// ---------------------------------------------------------------
func main() {
	fmt.Printf ("*** 開始 ***\n")
	err := godotenv.Load(".env")
	if err != nil {
		panic(err)
		}

	token := os.Getenv("PERSONAL_ACCESS_TOKEN")
	project_id := os.Getenv("PROJECT_ID")
	limit := "?page=1&per_page=10"
	url_target := "https://gitlab.com/api/v4/projects/" + project_id + "/members" + limit

	req, _ := http.NewRequest("GET", url_target, nil)
	req.Header.Set("PRIVATE-TOKEN", token)
	client := new(http.Client)
	res, err := client.Do(req)
	if err != nil {
		fmt.Println("Request error:", err)
		return
	}
	defer res.Body.Close()

	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		fmt.Println("Request error:", err)
		return
	}

	fmt.Println(len(body))

	str_json := string(body)

	var array_aa [](map[string]interface{})
	json.Unmarshal ([]byte(str_json), &array_aa )
	fmt.Println(len(array_aa))

//
	for  _, vv := range array_aa {
		fmt.Print(vv["id"],"\t")
		fmt.Print(vv["name"],"\t")
		fmt.Print(vv["username"],"\t")
		fmt.Print(vv["web_url"],"\t")
		fmt.Println(vv["created_at"])
		}

	fmt.Printf ("*** 終了 ***\n")
}

// ---------------------------------------------------------------
```

実行の準備

```bash
go mod init member
go mod tidy
```

実行コマンド

```bash
go run get_member.go
```

## プロジェクトのブランチの取得 ##

```go:get_branches.go
// ---------------------------------------------------------------
//
//	get_branches.go
//
//					May/07/2022
// ---------------------------------------------------------------
package main

import (
	"os"
	"fmt"
	"io/ioutil"
	"net/http"
	"encoding/json"
	"github.com/joho/godotenv"
)

// ---------------------------------------------------------------
func main() {
	fmt.Printf ("*** 開始 ***\n")
	err := godotenv.Load(".env")
	if err != nil {
		panic(err)
		}

	token := os.Getenv("PERSONAL_ACCESS_TOKEN")
	project_id := os.Getenv("PROJECT_ID")
	limit := "?page=1&per_page=10"
	url_target := "https://gitlab.com/api/v4/projects/" + project_id + "/repository/branches" + limit

	req, _ := http.NewRequest("GET", url_target, nil)
	req.Header.Set("PRIVATE-TOKEN", token)
	client := new(http.Client)
	res, err := client.Do(req)
	if err != nil {
		fmt.Println("Request error:", err)
		return
	}
	defer res.Body.Close()

	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		fmt.Println("Request error:", err)
		return
	}

	fmt.Println(len(body))

	str_json := string(body)

	var array_aa [](map[string]interface{})
	json.Unmarshal ([]byte(str_json), &array_aa )
	fmt.Println(len(array_aa))

//
	for  _, vv := range array_aa {
		fmt.Print(vv["name"],"\t")
		fmt.Print(vv["merged"],"\t")
		commit := vv["commit"].(map[string]interface{})
		fmt.Print(commit["author_name"],"\t")
		fmt.Println(commit["created_at"],"\t")
		}

	fmt.Printf ("*** 終了 ***\n")
}

// ---------------------------------------------------------------
```

実行コマンド

```bash
go run get_branches.go
```