Fiber si ispira al framework Web più popolare Express su Internet. Abbiamo combinato la usabilità di Express e le prestazioni grezze di Go. Se hai mai costruito un'applicazione Web utilizzando Node.js (usando Express o un framework simile), allora molti metodi e principi dovrebbero essere molto facili da capire per te.

Avvio rapido

Installazione

Assicurati di avere installato Go 1.17 o successivo.

Inizializza il tuo progetto creando una cartella ed eseguendo go mod init github.com/your/repo all'interno della cartella, quindi installa Fiber usando il comando go get:

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

Ciao, mondo

package main

// Importa il pacchetto fiber
import "github.com/gofiber/fiber/v2"

func main() {
    // Definisci l'applicazione fiber
    app := fiber.New()

    // Definisci il percorso http
    app.Get("/", func(c *fiber.Ctx) error {
        // Restituisci hello world come stringa
        return c.SendString("Ciao, Mondo ?!")
    })

    // Ascolta sulla porta 3000
    app.Listen(":3000")
}

Accesso tramite: http://localhost:3000/

Routing di base

Esempio di routing di base di 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) // => ✋ register
    })

    // GET /flights/LAX-SFO
    app.Get("/flights/:from-:to", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("? Da: %s, A: %s", c.Params("from"), c.Params("to"))
        return c.SendString(msg) // => ? Da: LAX, A: 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) // => ? dictionary.txt
    })

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

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

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

Servire file statici

Configurare il servizio di file statici

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/qualunque/percorso/mostra/index/html

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

Middleware

Migliora la capacità di gestire le richieste HTTP attraverso i middleware.

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

    // Corrispondenza con qualsiasi percorso, qui personalizza il middleware utilizzando una funzione di chiusura
    app.Use(func(c *fiber.Ctx) error {
        fmt.Println("? Primo gestore")
        // Continua a gestire il middleware successivo o la funzione di percorso
        return c.Next()
    })

    // Corrispondenza con i percorsi che iniziano con /api
    app.Use("/api", func(c *fiber.Ctx) error {
        fmt.Println("? Secondo gestore")
        return c.Next()
    })
    
    // Utilizza il middleware integrato per gestire le eccezioni
    app.Use(recover.New())

    // GET /api/register
    app.Get("/api/list", func(c *fiber.Ctx) error {
        fmt.Println("? Ultimo gestore")
        return c.SendString("Ciao, Mondo ?!")
    })

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

Motore del template

Se il motore del template non è impostato, Fiber di default utilizza html/template.

package main

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

func main() {
    // Imposta il motore del template
    app := fiber.New(fiber.Config{
        Views: pug.New("./views", ".pug"),
    })

    app.Get("/", func(c *fiber.Ctx) error {
        // Rendi il template ./views/home.pug utilizzando i parametri del template fiber.map
        return c.Render("home", fiber.Map{
            "title": "Homepage",
            "year":  1999,
        })
    })

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

Middleware per la condivisione delle risorse cross-origin (CORS)

Middleware per CORS in Fiber, può abilitare la condivisione delle risorse cross-origin con varie opzioni per prevenire attacchi CORS.

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

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

    // Configurazione predefinita di CORS
    app.Use(cors.New())

    // Oppure personalizza i parametri CORS per consentire le richieste da determinati domini
    app.Use(cors.New(cors.Config{
        AllowOrigins: "https://www.tizi365.com, https://tizi365.com",
        AllowHeaders:  "Origin, Content-Type, Accept",
    }))

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

Controlla CORS passando qualsiasi dominio nell'header Origin:

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

Risposta personalizzata 404

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

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

    app.Get("/demo", func(c *fiber.Ctx) error {
        return c.SendString("Questo è un demo!")
    })

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

    // L'ultimo middleware referenziato corrisponderà a tutte le richieste, inclusi i 404
    app.Use(func(c *fiber.Ctx) error {
        // Altra logica di gestione
        // Restituisci lo stato 404
        return c.SendStatus(404)
        // => 404 "Non trovato"
    })

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

Risposta JSON

Esempio di Fiber che restituisce dati JSON.

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": "Ciao John!",
        })
        // => {"success":true, "message":"Ciao John!"}
    })

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

Middleware di ripristino

Intercetta errori di panic per prevenire il crash e l'uscita del programma.

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

func main() {
    app := fiber.New()
	// Utilizza il middleware di panic per intercettare le eccezioni di panic
    app.Use(recover.New())

    app.Get("/", func(c *fiber.Ctx) error {
        panic("normalmente questo farebbe crashare la tua app")
    })

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

Test di prestazioni

[

Limitazioni

  • A causa dell'uso di funzionalità non sicure in Fiber, potrebbe non essere compatibile con le ultime versioni di Go. Fiber 2.40.0 è stato testato su versioni di Go da 1.17 a 1.21.
  • Fiber non è compatibile con l'interfaccia net/http. Ciò significa che non è possibile utilizzare direttamente progetti come gqlgen, go-swagger o altri progetti appartenenti all'ecosistema net/http.