Fiber вдохновлен самым популярным веб-фреймворком Express в интернете. Мы объединяем удобство Express и сырую производительность Go. Если вы когда-либо создавали веб-приложение с использованием Node.js (используя Express или подобный фреймворк), то многие методы и принципы должны быть для вас очень простыми.

Быстрый старт

Установка

Убедитесь, что у вас установлен Go 1.17 или выше.

Инициализируйте ваш проект, создав папку и запустив go mod init github.com/your/repo внутри папки, затем установите Fiber, используя команду go get:

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

Hello World

package main

// Импортируем пакет Fiber
import "github.com/gofiber/fiber/v2"

func main() {
    // Определяем приложение Fiber
    app := fiber.New()

    // Определяем http-маршрут
    app.Get("/", func(c *fiber.Ctx) error {
        // Возвращаем строку "Привет, мир!"
        return c.SendString("Привет, Мир ?!")
    })

    // Слушаем порт 3000
    app.Listen(":3000")
}

Доступ по адресу: http://localhost:3000/

Базовая маршрутизация

Пример базовой маршрутизации в 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("? Откуда: %s, Куда: %s", c.Params("from"), c.Params("to"))
        return c.SendString(msg) // => ? From: LAX, To: 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 имеет %s лет", c.Params("name"), c.Params("age"))
        return c.SendString(msg) // => ? john is 75 years old
    })

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

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

Обслуживание статических файлов

Настройка обслуживания статических файлов

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"))
}

Промежуточное программное обеспечение

Расширьте возможность обработки HTTP-запросов через промежуточное программное обеспечение.

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

    // Сопоставляем любой маршрут, здесь настраиваем промежуточное программное обеспечение, используя замыкание
    app.Use(func(c *fiber.Ctx) error {
        fmt.Println("? Первый обработчик")
        // Продолжаем обрабатывать следующее промежуточное программное обеспечение или функцию маршрута
        return c.Next()
    })

    // Сопоставление маршрутов, начинающихся с /api
    app.Use("/api", func(c *fiber.Ctx) error {
        fmt.Println("? Второй обработчик")
        return c.Next()
    })
    
    // Используем встроенное промежуточное программное обеспечение для обработки исключений
    app.Use(recover.New())

    // GET /api/register
    app.Get("/api/list", func(c *fiber.Ctx) error {
        fmt.Println("? Последний обработчик")
        return c.SendString("Привет, Мир ?!")
    })

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

Шаблонизатор

Если шаблонизатор не установлен, Fiber по умолчанию использует html/template.

package main

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

func main() {
    // Установка шаблонизатора
    app := fiber.New(fiber.Config{
        Views: pug.New("./views", ".pug"),
    })

    app.Get("/", func(c *fiber.Ctx) error {
        // Рендеринг шаблона ./views/home.pug с использованием параметров шаблона fiber.map
        return c.Render("home", fiber.Map{
            "title": "Домашняя страница",
            "year":  1999,
        })
    })

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

Промежуточное программное обеспечение для обмена ресурсами с другими источниками (CORS)

Промежуточное программное обеспечение для CORS в Fiber, позволяет осуществлять обмен ресурсами с другими источниками с различными параметрами для предотвращения атак CORS.

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

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

    // Конфигурация CORS по умолчанию
    app.Use(cors.New())

    // Или настраиваем параметры CORS для разрешения запросов с определенных доменов
    app.Use(cors.New(cors.Config{
        AllowOrigins: "https://www.tizi365.com, https://tizi365.com",
        AllowHeaders:  "Origin, Content-Type, Accept",
    }))

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

Проверить CORS, передав в заголовке Origin любой домен:

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

Пользовательский ответ 404

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

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

    app.Get("/demo", func(c *fiber.Ctx) error {
        return c.SendString("Это демо!")
    })

    app.Post("/register", func(c *fiber.Ctx) error {
        return c.SendString("Добро пожаловать!")
    })

    // Последнее используемое промежуточное программное обеспечение будет соответствовать всем запросам, включая 404
    app.Use(func(c *fiber.Ctx) error {
        // Другая логика обработки
        // Возврат кода состояния 404
        return c.SendStatus(404)
        // => 404 "Не найдено"
    })

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

Ответ в формате JSON

Пример возвращения данных в формате JSON в 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": "Привет, Джон!",
        })
        // => {"success":true, "message":"Привет, Джон!"}
    })

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

Промежуточное программное обеспечение восстановления

Перехват ошибок паники для предотвращения аварийного завершения программы.

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

func main() {
    app := fiber.New()
	// Используйте промежуточное программное обеспечение для перехвата исключений паники
    app.Use(recover.New())

    app.Get("/", func(c *fiber.Ctx) error {
        panic("обычно это привело бы к аварийному завершению вашего приложения")
    })

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

Оценка производительности

[

Ограничения

  • Из-за использования небезопасных функций в Fiber он может быть несовместим с последними версиями Go. Fiber 2.40.0 был протестирован с версиями Go от 1.17 до 1.21.
  • Fiber несовместим с интерфейсом net/http. Это означает, что вы не можете непосредственно использовать проекты, такие как gqlgen, go-swagger или любые другие проекты, принадлежащие экосистеме net/http.