Scharf Beobachtet

Tech Know How

Restful Service mit Go und Gin

2021-11-26 08:05:00

Angelehnt an eines der offiziellen Golang Tutorials hier der Code für einen Restful Service. Es können Einträge einzeln oder als Liste abgerufen werden. Hinzufügen ist auch möglich, mit Prüfung ob die Id bereits existiert.

package main

import (
	"errors"
	"net/http"

	"github.com/gin-gonic/gin"
)

type rgb struct {
	ID   string `json:"id"`
	Name string `json:"title"`
	R    int    `json:"r"`
	G    int    `json:"g"`
	B    int    `json:"b"`
}

var rgbs = []rgb{
	{ID: "1", Name: "Volles Rot", R: 255, G: 0, B: 0},
	{ID: "2", Name: "Volles Grün", R: 0, G: 255, B: 0},
	{ID: "3", Name: "Volles Blau", R: 0, G: 0, B: 255},
}

func main() {
	router := gin.Default()
	router.GET("/rgbs", getRgbs)
	router.GET("/rgbs/:id", getRgbByID)
	router.POST("/rgbs", postRgbs)

	router.Run("localhost:8585")
}

func getRgbs(c *gin.Context) {
	c.IndentedJSON(http.StatusOK, rgbs)
}

func postRgbs(c *gin.Context) {
	var newRgb rgb
	if err := c.BindJSON(&newRgb); err != nil {
		return
	}

	_, err := findById(newRgb.ID)
	if err == nil {
		c.IndentedJSON(http.StatusNotFound, gin.H{"message": "id already there"})
		return
	}

	rgbs = append(rgbs, newRgb)
	c.IndentedJSON(http.StatusCreated, newRgb)
}

func getRgbByID(c *gin.Context) {
	id := c.Param("id")

	for _, a := range rgbs {
		if a.ID == id {
			c.IndentedJSON(http.StatusOK, a)
			return
		}
	}
	c.IndentedJSON(http.StatusNotFound, gin.H{"message": "rgb not found"})
}

func findById(id string) (rgb, error) {
	for _, a := range rgbs {
		if a.ID == id {
			return a, nil
		}
	}
	var newRgb rgb
	return newRgb, errors.New("Not found")
}

Da ein externes Package verwendet wird, muss dieses noch vor dem ersten Lauf installiert werden. Dann kann es los gehen. Ins Verzeichnis der o. g. Datei (main.go) wechseln, dann.

go get .
go run

Aufrufen kann man dann mit folgenden Curl Befehlen

curl http://localhost:8585/rgbs

Hier bekommt man aufgrund der vorhandenen Id eine Fehlermeldung

curl http://localhost:8585/rgbs \
    --include \
    --header "Content-Type: application/json" \
    --request "POST" \
    --data '{"id": "1","title": "Volles Rot","r": 255,"g": 0, "b": 0}'

Hier klappt es

curl http://localhost:8585/rgbs \
    --include \
    --header "Content-Type: application/json" \
    --request "POST" \
    --data '{"id": "5","title": "Weiß","r": 255,"g": 255, "b": 255}'
Zurück