Fiber est inspiré du framework Express le plus populaire sur Internet. Nous combinons la facilité d'utilisation d'Express et les performances brutes de Go. Si vous avez déjà construit une application Web en utilisant Node.js (en utilisant Express ou un framework similaire), de nombreuses méthodes et principes devraient être très faciles à comprendre pour vous.

Démarrage rapide

Installation

Assurez-vous d'avoir Go 1.17 ou une version supérieure installée.

Initialisez votre projet en créant un dossier et en exécutant go mod init github.com/votre/repo à l'intérieur du dossier, puis installez Fiber en utilisant la commande go get :

go get -u github.com/gofiber/fiber/v2

Hello, World

package main

// Importez le package fiber
import "github.com/gofiber/fiber/v2"

func main() {
    // Définissez l'application fiber
    app := fiber.New()

    // Définissez la route http
    app.Get("/", func(c *fiber.Ctx) error {
        // Retournez "Bonjour, le monde" en tant que chaîne de caractères
        return c.SendString("Bonjour, le monde ?!")
    })

    // Écoutez sur le port 3000
    app.Listen(":3000")
}

Accédez via : http://localhost:3000/

Routage de base

Exemple de routage de base de Fiber

func main() {
    app := fiber.New()

    // GET /api/register
    app.Get("/api/*", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("✋ %s", c.Params("*"))
        return c.SendString(msg) // => ✋ enregistrer
    })

    // GET /flights/LAX-SFO
    app.Get("/flights/:from-:to", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("? De : %s, À : %s", c.Params("from"), c.Params("to"))
        return c.SendString(msg) // => ? De : LAX, À : SFO
    })

    // GET /dictionary.txt
    app.Get("/:file.:ext", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("? %s.%s", c.Params("file"), c.Params("ext"))
        return c.SendString(msg) // => ? dictionnaire.txt
    })

    // GET /john/75
    app.Get("/:name/:age/:gender?", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("? %s a %s ans", c.Params("name"), c.Params("age"))
        return c.SendString(msg) // => ? john a 75 ans
    })

    // GET /john
    app.Get("/:name", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("Bonjour, %s ?!", c.Params("name"))
        return c.SendString(msg) // => Bonjour john ?!
    })

    log.Fatal(app.Listen(":3000"))
}

Fourniture de fichiers statiques

Configuration de la fourniture de fichiers statiques

func main() {
    app := fiber.New()

    app.Static("/", "./public")
    // => http://localhost:3000/js/script.js
    // => http://localhost:3000/css/style.css

    app.Static("/prefix", "./public")
    // => http://localhost:3000/prefix/js/script.js
    // => http://localhost:3000/prefix/css/style.css

    app.Static("*", "./public/index.html")
    // => http://localhost:3000/any/path/shows/index/html

    log.Fatal(app.Listen(":3000"))
}

Middleware

Améliorez la capacité à gérer les requêtes HTTP à travers les middlewares.

func main() {
    app := fiber.New()

    // Correspond à n'importe quelle route, ici personnalisez le middleware en utilisant une fonction de fermeture
    app.Use(func(c *fiber.Ctx) error {
        fmt.Println("? Premier gestionnaire")
        // Continuez à gérer le prochain middleware ou la fonction de routage
        return c.Next()
    })

    // Correspond aux routes commençant par /api
    app.Use("/api", func(c *fiber.Ctx) error {
        fmt.Println("? Deuxième gestionnaire")
        return c.Next()
    })
    
    // Utilisez le middleware intégré pour gérer les exceptions
    app.Use(recover.New())

    // GET /api/register
    app.Get("/api/list", func(c *fiber.Ctx) error {
        fmt.Println("? Dernier gestionnaire")
        return c.SendString("Bonjour, le monde ?!")
    })

    log.Fatal(app.Listen(":3000"))
}

Moteur de template

Si le moteur de template n'est pas défini, Fiber utilise par défaut html/template.

package main

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/template/pug"
)

func main() {
    // Définir le moteur de template
    app := fiber.New(fiber.Config{
        Views: pug.New("./views", ".pug"),
    })

    app.Get("/", func(c *fiber.Ctx) error {
        // Rendre le template ./views/home.pug en utilisant les paramètres du template fiber.map
        return c.Render("home", fiber.Map{
            "title": "Page d'accueil",
            "year":  1999,
        })
    })

    log.Fatal(app.Listen(":3000"))
}

Middleware de partage des ressources inter-origines (CORS)

Un middleware pour CORS dans Fiber, qui peut activer le partage inter-origines des ressources avec diverses options pour prévenir les attaques CORS.

import (
    "log"
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/cors"
)

func main() {
    app := fiber.New()

    // Configuration CORS par défaut
    app.Use(cors.New())

    // Ou personnaliser les paramètres CORS pour autoriser les requêtes à partir de certains domaines
    app.Use(cors.New(cors.Config{
        AllowOrigins: "https://www.tizi365.com, https://tizi365.com",
        AllowHeaders:  "Origin, Content-Type, Accept",
    }))

    log.Fatal(app.Listen(":3000"))
}

Vérifiez CORS en passant n'importe quel domaine dans l'en-tête Origin:

curl -H "Origin: https://www.tizi365.com" --verbose http://localhost:3000

Réponse 404 personnalisée

func main() {
    app := fiber.New()

    app.Static("/", "./public")

    app.Get("/demo", func(c *fiber.Ctx) error {
        return c.SendString("Ceci est une démo !")
    })

    app.Post("/register", func(c *fiber.Ctx) error {
        return c.SendString("Bienvenue !")
    })

    // Le dernier middleware référencé correspondra à toutes les requêtes, y compris 404
    app.Use(func(c *fiber.Ctx) error {
        // Autre logique de gestion
        // Renvoyer le statut 404
        return c.SendStatus(404)
        // => 404 "Non trouvé"
    })

    log.Fatal(app.Listen(":3000"))
}

Réponse JSON

Exemple de réponse JSON renvoyée par Fiber.

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    app := fiber.New()

    app.Get("/user", func(c *fiber.Ctx) error {
        return c.JSON(&User{"John", 20})
        // => {"name":"John", "age":20}
    })

    app.Get("/json", func(c *fiber.Ctx) error {
        return c.JSON(fiber.Map{
            "success": true,
            "message": "Salut John!",
        })
        // => {"success":true, "message":"Salut John!"}
    })

    log.Fatal(app.Listen(":3000"))
}

Middleware de récupération

Intercepter les erreurs de panique pour empêcher le crash et la sortie du programme.

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/recover"
)

func main() {
    app := fiber.New()
	// Utiliser le middleware de panique pour intercepter les exceptions de panique
    app.Use(recover.New())

    app.Get("/", func(c *fiber.Ctx) error {
        panic("normalement, cela ferait planter votre application")
    })

    log.Fatal(app.Listen(":3000"))
}

Benchmark

[

Limitations

  • En raison de l'utilisation de fonctionnalités non sécurisées dans Fiber, il peut être incompatible avec les dernières versions de Go. Fiber 2.40.0 a été testé sur les versions de Go 1.17 à 1.21.
  • Fiber n'est pas compatible avec l'interface net/http. Cela signifie que vous ne pouvez pas utiliser directement des projets tels que gqlgen, go-swagger, ou tout autre projet appartenant à l'écosystème net/http.