GIN ist ein Framework um REST Microservices zu bauen.
Erster Versuch
package main import ( "net/http" "github.com/gin-gonic/gin" ) func PingPong(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "pong", }) } func main() { // Init GIN r := gin.Default() // Add Routes r.GET("/ping", PingPong) // Run GIN r.Run() }
Test:
Das Script mit starten mit „go run“ oder das Script kompilieren und ausführen.
Anschließend kann mit CURL getestet werden.
curl -X GET http://localhost:8080/ping {"message":"pong"}
Ausliefern von Daten per JSON
Um Daten per JSON auszuliefern müssen sie als JSON serialisiert werden. Dazu kann die Funktion JSON die über den Context c zur Verfügung steht genutzt werden.
package main import ( "net/http" "github.com/gin-gonic/gin" ) func PingPong(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "pong", }) } type DVDRecord struct { Title string `json:"title"` ReleaseYear int `json:"release_year"` Genre string `json:"genre"` Director string `json:"director"` } var dvd_records = []DVDRecord{ DVDRecord{ Title: "Lalala", ReleaseYear: 2022, Genre: "Horror", Director: "Mr. Brown", }, DVDRecord{ Title: "Foobar", ReleaseYear: 2021, Genre: "Comedy", Director: "Hanibal Lector", }, } func GetDVDList(c *gin.Context) { c.JSON(http.StatusOK, &dvd_records) } func main() { // Init GIN r := gin.Default() // Add Routes r.GET("/ping", PingPong) r.GET("/getdvdlist", GetDVDList) // Run GIN r.Run() }
Test mit CURL & JQ
curl -X GET http://localhost:8080/getdvdlist | jq
JSON per POST schicken
In diesem Schritt wird das Script um eine Funktion „AddDVDtoList“ erweitert um JSON Daten per POST zu empfangen. Die Daten werden durch „BindJSON“ deserialisiert und in ein Struct geschrieben.
package main import ( "log" "net/http" "github.com/gin-gonic/gin" ) func PingPong(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "pong", }) } type DVDRecord struct { Title string `json:"title"` ReleaseYear int `json:"release_year"` Genre string `json:"genre"` Director string `json:"director"` } var dvd_records = []DVDRecord{ DVDRecord{ Title: "Lalala", ReleaseYear: 2022, Genre: "Horror", Director: "Mr. Brown", }, DVDRecord{ Title: "Foobar", ReleaseYear: 2021, Genre: "Comedy", Director: "Hanibal Lector", }, } func GetDVDList(c *gin.Context) { c.JSON(http.StatusOK, &dvd_records) } func AddDVDtoList(c *gin.Context) { var data DVDRecord if err := c.BindJSON(&data); err != nil { log.Fatalln("error") } dvd_records = append(dvd_records, data) c.JSON(http.StatusCreated, gin.H{"data": data}) } func main() { // Init GIN r := gin.Default() // Add Routes r.GET("/ping", PingPong) r.GET("/getdvdlist", GetDVDList) r.POST("/adddvdtolist", AddDVDtoList) // Run GIN r.Run() }
Test mit CURL
curl -X POST http://localhost:8080/adddvdtolist -d '{"title":"Yeah","release_year":2000,"genre":"Drama","director":"Krusty Clown"}' | jq curl -X GET http://localhost:8080/getdvdlist | jq
Header auslesen
Hier ein Beispiel wie man Header auslesen kann.
... func ShowHeader(c *gin.Context) { header := c.GetHeader("Authorization") c.JSON(http.StatusOK, gin.H{"header": header}) } ... r.GET("/showheader", ShowHeader) ...
Test mit CURL
curl -X GET http://localhost:8080/showheader -H "Authorization: Bearer lalala123" | jq
Fortsetzung folgt 😉