# #templates #struct #go #commit #gitlab
#шаблоны #структура #Вперед #фиксация #gitlab
Вопрос:
Теперь… Я хочу скопировать «коммиты» из Gitlab в мою собственную написанную программу (я студент).
Я написал это:
package main
import (
"encoding/json"
"fmt"
"github.com/gorilla/mux"
"html/template"
"log"
"net/http"
"os"
)
type Project struct {
Idint64`json:"project_id"`
Titel string `json:"title"`
Name string `json:"name"`
Data Data `json:"data"`
Commits Commits`json:"commits"`
}
type Data struct {
Id int64 `json:"user_id"`
Username string `json:"user_name"`
}
type Commits struct {
Id string `json:"id"`
Message string `json:"message"`
}
func SetupRouter() http.Handler {
r := mux.NewRouter()
r.HandleFunc("/", Home).Methods("GET")
r.HandleFunc("/projects", Projects).Methods("GET")
return r
}
func main() {
port := os.Getenv("PORT")
if port == "" {
port = "3000"
}
r := SetupRouter()
http.ListenAndServe(":" port, r)
log.Fatalln(http.ListenAndServe(":" port, r))
}
func Home(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("Content-Type", "application/json")
fmt.Fprint(rw, "{"hello:""world"}")
}
func Projects(rw http.ResponseWriter, req *http.Request) {
resp, err := http.Get("https://gitlab.nolteundlauth.de/api/v3/projects/44/events?private_token=*XXXXXXXXXXXXXXX*")
if err != nil {
fmt.Println("Error: " err.Error())
return
}
defer resp.Body.Close()
var projects []Project
dec := json.NewDecoder(resp.Body)
err = dec.Decode(amp;projects)
if err != nil {
fmt.Println("Error parsing json")
}
tmpl, _ := template.ParseFiles("projects.tpl")
tmpl.Execute(rw, projects)
}
И мой файл шаблона:
<html>
<body>
<h1>Commits</h1>
{{range .}}
{{.Id}} {{.Name}} ({{.Data.Id}}) ({{.Data.Username}}) ({{.Commits.Id}}) ({{.Commits.Message}}) <br>
{{end}}
</body>
</html>
И API для этих коммитов из Gitlab является:
"commits": [{
"id": "c5feabde2d8cd023215af4d2ceeb7a64839fc428",
"message": "Add simple search to projects in public area",
"timestamp": "2013-05-13T18:18:08 00:00",
"url": "https://dev.gitlab.org/gitlab/gitlabhq/commit/c5feabde2d8cd023215af4d2ceeb7a64839fc428",
"author": {
"name": "Dmitriy Zaporozhets",
"email": "dmitriy.zaporozhets@gmail.com"
}
}],
Когда я запускаю сервер, я получаю все значения из structvariables, кроме коммитов. Почему?
Комментарии:
1. «коммиты» в JSON — это массив. Попробуйте
Commits []Commits
.2. Не работает. Я не уверен, но я думаю, что допустил ошибку в своем файле шаблона или при создании структуры для коммитов
3. Поскольку
Commits
это массив.. вам также нужноrange
изменить это в вашем шаблоне. Кроме того, чтобы отладить это, заменитеExecute
строку вашего шаблона на:fmt.Fprintf(rw, "%s", projects)
, чтобы он выводил ваш объект в ответ, и вы могли убедиться, что он структурирован так, как вы ожидаете.