GO: REST Microservice mit GIN

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 😉

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.