Démarrage avec le framework web Go Iris

Installation

Remarque : Nécessite la version Go 1.20 ou supérieure.

$ mkdir myapp
$ cd myapp
$ go mod init myapp
$ go get github.com/kataras/iris/v12@latest

Importez-le dans votre code :

import "github.com/kataras/iris/v12"

Résolution des problèmes d'installation

Si vous rencontrez des erreurs réseau lors de l'installation, assurez-vous que la variable d'environnement GOPROXY est définie sur une valeur valide.

go env -w GOPROXY=https://goproxy.io,direct

Si les méthodes ci-dessus ne résolvent pas le problème, videz le cache du module Go :

go clean --modcache

Démarrage rapide

Mode fonctionnel

$ cat main.go
package main

import "github.com/kataras/iris/v12"

func main() {
    // Définir l'instance iris
    app := iris.New()

    // Définir un groupe de routes, (ici définit un groupe de routes avec un préfixe /books)
    booksAPI := app.Party("/books")
    {
        // Utiliser un middleware
        booksAPI.Use(iris.Compression)

        // Définir les routes et les gestionnaires de routes
        // GET: http://localhost:8080/books
        booksAPI.Get("/", list)
        // POST: http://localhost:8080/books
        booksAPI.Post("/", create)
    }

    // Écouter sur le port
    app.Listen(":8080")
}

// Exemple de livre.
type Book struct {
    Title string `json:"title"`
}

func list(ctx iris.Context) {
    books := []Book{
        {"Maîtriser la concurrence en Go"},
        {"Modèles de conception Go"},
        {"Chapeau noir Go"},
    }

    ctx.JSON(books)
    // Remarque : Négociation de la réponse basée sur la priorité du serveur et la préférence du client
    // au lieu d'utiliser ctx.JSON :
    // ctx.Negotiation().JSON().MsgPack().Protobuf()
    // ctx.Negotiate(books)
}

func create(ctx iris.Context) {
    var b Book
    err := ctx.ReadJSON(&b)
    // Remarque : utilisez ctx.ReadBody(&b) pour lier les données entrantes de n'importe quel type.
    if err != nil {
        ctx.StopWithProblem(iris.StatusBadRequest, iris.NewProblem().
            Title("Échec de la création du livre").DetailErr(err))
        // Remarque : utilisez ctx.StopWithError(code, err) en cas d'attente d'une réponse en texte brut uniquement en cas d'erreur.
        return
    }

    println("Livre reçu : " + b.Title)

    ctx.StatusCode(iris.StatusCreated)
}

Modèle architectural MVC

Importer le package MVC

import "github.com/kataras/iris/v12/mvc"

Configurer le contrôleur basé sur le groupe de routes

m := mvc.New(booksAPI)
m.Handle(new(BookController))

Implémentation du contrôleur

type BookController struct {
    /* Injection de dépendance */
}

// Répondre à GET: http://localhost:8080/books
func (c *BookController) Get() []Book {
    return []Book{
        {"Maîtriser la concurrence en Go"},
        {"Modèles de conception Go"},
        {"Go Black Hat"},
    }
}

// Répondre à POST: http://localhost:8080/books
func (c *BookController) Post(b Book) int {
    println("Livre reçu : " + b.Title)

    return iris.StatusCreated
}

Exécutez votre serveur web Iris :

$ go run main.go
> En écoute sur : http://localhost:8080
> L'application a démarré. Appuyez sur CTRL+C pour l'arrêter.

Listez les livres :

$ curl --header 'Accept-Encoding:gzip' http://localhost:8080/books

[
  {
    "title": "Maîtriser la concurrence en Go"
  },
  {
    "title": "Modèles de conception Go"
  },
  {
    "title": "Go Black Hat"
  }
]

Créez un nouveau livre :

$ curl -i -X POST \
--header 'Content-Encoding:gzip' \
--header 'Content-Type:application/json' \
--data "{\"title\":\"Écrire un interpréteur en Go\"}" \
http://localhost:8080/books

> HTTP/1.1 201 Créé

Il s'agit d'un exemple de réponse d'erreur :

$ curl -X POST --data "{\"title\" \"Livre invalide\"}" \
http://localhost:8080/books

> HTTP/1.1 400 Requête incorrecte

{
  "status": 400,
  "title": "Échec de la création du livre",
  "detail": "caractère invalide «" après la clé de l'objet"
}