Fiber zainspirowany jest najbardziej popularnym frameworkiem Webowym Express w Internecie. Łączymy użyteczność Expressu i czystą wydajność Go. Jeśli kiedykolwiek tworzyłeś aplikację Webową używając Node.js (korzystając z Express lub podobnego frameworka), wiele metod i zasad powinno być dla Ciebie bardzo łatwe do zrozumienia.

Szybki Start

Instalacja

Upewnij się, że masz zainstalowany Go w wersji 1.17 lub nowszej.

Zainicjalizuj swój projekt, tworząc folder i uruchamiając polecenie go mod init github.com/your/repowewnątrz folderu, a następnie zainstaluj Fiber przy użyciu polecenia go get:

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

Hello World

package main

// Importuj pakiet fiber
import "github.com/gofiber/fiber/v2"

func main() {
    // Zdefiniuj aplikację Fiber
    app := fiber.New()

    // Zdefiniuj trasę http
    app.Get("/", func(c *fiber.Ctx) error {
        // Zwróć "Hello, World ?!" jako ciąg znaków
        return c.SendString("Hello, World ?!")
    })

    // Nasłuchuj na porcie 3000
    app.Listen(":3000")
}

Dostępne pod adresem: http://localhost:3000/

Podstawowa Trasowanie

Przykład podstawowego trasowania w 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("? Z: %s, Do: %s", c.Params("from"), c.Params("to"))
        return c.SendString(msg) // => ? Z: LAX, Do: 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 ma %s lat", c.Params("name"), c.Params("age"))
        return c.SendString(msg) // => ? john ma 75 lat
    })

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

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

Serwowanie Statycznych Plików

Ustawienie serwowania statycznych plików

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

Zwiększ zdolność obsługi żądań HTTP za pomocą middleware.

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

    // Dopasuj dowolną trasę, tutaj dostosuj middleware za pomocą funkcji domknięcia
    app.Use(func(c *fiber.Ctx) error {
        fmt.Println("? Pierwszy obsługujący")
        // Kontynuuj obsługę następnego middleware lub funkcji trasy
        return c.Next()
    })

    // Dopasuj trasy zaczynające się od /api
    app.Use("/api", func(c *fiber.Ctx) error {
        fmt.Println("? Drugi obsługujący")
        return c.Next()
    })
    
    // Użyj wbudowanego middleware do obsługi wyjątków
    app.Use(recover.New())

    // GET /api/register
    app.Get("/api/list", func(c *fiber.Ctx) error {
        fmt.Println("? Ostatni obsługujący")
        return c.SendString("Hello, World ?!")
    })

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

Silnik szablonów

Jeśli silnik szablonów nie jest ustawiony, Fiber domyślnie używa html/template.

package main

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

func main() {
    // Ustawienie silnika szablonów
    app := fiber.New(fiber.Config{
        Views: pug.New("./views", ".pug"),
    })

    app.Get("/", func(c *fiber.Ctx) error {
        // Renderowanie szablonu ./views/home.pug przy użyciu parametrów szablonu z fiber.map
        return c.Render("home", fiber.Map{
            "title": "Strona główna",
            "year":  1999,
        })
    })

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

Pośrednictwo zasobów z innego pochodzenia (CORS)

Pośrednictwo dla CORS w Fiber, umożliwia aktywację udostępniania zasobów z innych domen z różnymi opcjami zapobiegającymi atakom CORS.

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

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

    // Konfiguracja domyślna dla CORS
    app.Use(cors.New())

    // Lub dostosowanie parametrów CORS, aby zezwolić na żądania z określonych domen
    app.Use(cors.New(cors.Config{
        AllowOrigins: "https://www.tizi365.com, https://tizi365.com",
        AllowHeaders:  "Origin, Content-Type, Accept",
    }))

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

Sprawdź CORS, przekazując dowolną domenę w nagłówku Origin:

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

Dostosowana odpowiedź 404

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

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

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

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

    // Ostatnie pośrednictwo będzie dopasowane do wszystkich żądań, włączając 404
    app.Use(func(c *fiber.Ctx) error {
        // Inna logika obsługi
        // Zwróć status 404
        return c.SendStatus(404)
        // => 404 "Not Found"
    })

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

Odpowiedź JSON

Przykład użycia Fiber do zwracania danych 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": "Cześć John!",
        })
        // => {"success":true, "message":"Cześć John!"}
    })

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

Pośrednictwo przywracania

Przechwytywanie błędów panic, aby zapobiec awarii programu i jego zakończeniu.

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

func main() {
    app := fiber.New()
    // Użyj pośrednictwa panic, aby przechwycić wyjątki panic
    app.Use(recover.New())

    app.Get("/", func(c *fiber.Ctx) error {
        panic("zazwyczaj to spowodowałoby awarię twojej aplikacji")
    })

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

Test wydajności

[

Ograniczenia

  • Ze względu na użycie niebezpiecznych funkcji w Fiber, może on być niekompatybilny z najnowszymi wersjami Go. Fiber 2.40.0 został przetestowany na wersjach Go od 1.17 do 1.21.
  • Fiber nie jest kompatybilny z interfejsem net/http. Oznacza to, że nie można bezpośrednio używać projektów takich jak gqlgen, go-swagger czy innych projektów należących do ekosystemu net/http.