Skip to content

Latest commit

 

History

History
721 lines (561 loc) · 53.7 KB

README_uk.md

File metadata and controls

721 lines (561 loc) · 53.7 KB

Fiber

Fiber — це веб фреймворк, який був натхненний Express і заснований на Fasthttp, найшвидшому HTTP-двигунові написаному на Go. Фреймворк розроблено з метою спростити процес швидкої розробки високопродуктивних веб-додатків з нульовим розподілом пам'яті.

⚡️ Швидкий старт

package main

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

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

    app.Get("/", func(c *fiber.Ctx) error {
        return c.SendString("Hello, World 👋!")
    })

    app.Listen(":3000")
}

🤖 Еталонні показники

Тестування проводилося за допомогою TechEmpower та Go Web. Якщо ви хочете побачити всі результати, будь ласка відвідайте наш Wiki.

⚙️ Встановлення

Переконайтеся, що Go встановлено (завантажити). Потрібна версія 1.17 або вища.

Ініціалізуйте проект, створивши папку, а потім запустивши go mod init github.com/your/repo (детальніше) всередині цієї папки. Далі встановіть Fiber за допомогою команди go get:

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

🎯 Особливості

💡 Філософія

Нові програмісти, які переходять із Node.js на Go, мають справу зі звивистою кривою навчання, перш ніж можуть розпочати створення своїх веб-додатків або мікросервісів. Fiber, як веб-фреймворк, було створено з ідеєю мінімалізму та слідує шляху UNIX, щоб нові програмісти могли швидко увійти у світ Go з теплим та надійним прийомом.

Fiber натхненний Express, найпопулярнішим веб-фреймворком в Інтернеті. Ми поєднали легкість Express і чисту продуктивність Go. Якщо ви коли-небудь реалізовували веб-додаток у Node.js (з використанням Express або подібного), то багато методів і принципів здадуться вам дуже звичайними.

Ми прислухаємося до наших користувачів у issues, Discord сервері та в інших місцях Інтернета, щоб створити швидкий, гнучкий та доброзичливий веб фреймворк на Go для будь-яких завдань, дедлайнів та рівнів розробників! Як це робить Express у світі JavaScript.

⚠️ Обмеження

  • Через те, що Fiber використовує unsafe, бібліотека не завжди може бути сумісною з останньою версією Go. Fiber 2.40.0 було протестовано з Go версій 1.17 до 1.21.
  • Fiber не сумісний з інтерфейсами net/http. Це означає, що ви не зможете використовувати такі проекти, як gqlgen, go-swagger або будь-які інші, які є частиною екосистеми net/http.

👀 Приклади

Нижче наведено деякі типові приклади. Якщо ви хочете переглянути більше прикладів коду, відвідайте наше репозиторій рецептів або відвідайте нашу розміщену документацію API.

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("💸 From: %s, To: %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 is %s years old", 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("Hello, %s 👋!", c.Params("name"))
        return c.SendString(msg) // => Hello john 👋!
    })

    log.Fatal(app.Listen(":3000"))
}
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
    }).Name("api")

    data, _ := json.MarshalIndent(app.GetRoute("api"), "", "  ")
    fmt.Print(string(data))
    // Prints:
    // {
    //    "method": "GET",
    //    "name": "api",
    //    "path": "/api/*",
    //    "params": [
    //      "*1"
    //    ]
    // }


    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"))
}
func main() {
    app := fiber.New()

    // Match any route
    app.Use(func(c *fiber.Ctx) error {
        fmt.Println("🥇 First handler")
        return c.Next()
    })

    // Match all routes starting with /api
    app.Use("/api", func(c *fiber.Ctx) error {
        fmt.Println("🥈 Second handler")
        return c.Next()
    })

    // GET /api/list
    app.Get("/api/list", func(c *fiber.Ctx) error {
        fmt.Println("🥉 Last handler")
        return c.SendString("Hello, World 👋!")
    })

    log.Fatal(app.Listen(":3000"))
}
📚 Показати більше прикладів коду

Двигуни перегляду

📖 Конфігурація 📖 Двигуни 📖 Рендер

Fiber за умовчанням використовує html/template, якщо жодного двигуна не було вказано.

Якщо ви хочете виконати частково або використовувати інший двигун, наприклад amber, handlebars, mustache або jade, тощо.

Перегляньте наш пакет Шаблон, який підтримує кілька двигунів перегляду.

package main

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

func main() {
    // You can setup Views engine before initiation app:
    app := fiber.New(fiber.Config{
        Views: pug.New("./views", ".pug"),
    })

    // And now, you can call template `./views/home.pug` like this:
    app.Get("/", func(c *fiber.Ctx) error {
        return c.Render("home", fiber.Map{
            "title": "Homepage",
            "year":  1999,
        })
    })

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

Групування маршрутів у ланцюги

📖 Група

func middleware(c *fiber.Ctx) error {
    fmt.Println("Don't mind me!")
    return c.Next()
}

func handler(c *fiber.Ctx) error {
    return c.SendString(c.Path())
}

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

    // Root API route
    api := app.Group("/api", middleware) // /api

    // API v1 routes
    v1 := api.Group("/v1", middleware) // /api/v1
    v1.Get("/list", handler)           // /api/v1/list
    v1.Get("/user", handler)           // /api/v1/user

    // API v2 routes
    v2 := api.Group("/v2", middleware) // /api/v2
    v2.Get("/list", handler)           // /api/v2/list
    v2.Get("/user", handler)           // /api/v2/user

    // ...
}

Middleware логування

📖 Логування

package main

import (
    "log"

    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/logger"
)

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

    app.Use(logger.New())

    // ...

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

Спільне використання ресурсів між джерелами (CORS)

📖 CORS

import (
    "log"

    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/cors"
)

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

    app.Use(cors.New())

    // ...

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

Перевірте CORS, передавши будь-який домен у заголовку Origin:

curl -H "Origin: http://example.com" --verbose http://localhost:3000

Власна відповідь 404

📖 HTTP Методи

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

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

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

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

    // Last middleware to match anything
    app.Use(func(c *fiber.Ctx) error {
        return c.SendStatus(404)
        // => 404 "Not Found"
    })

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

JSON Відповідь

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

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

WebSocket Upgrade

📖 Websocket

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

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

  app.Get("/ws", websocket.New(func(c *websocket.Conn) {
    for {
      mt, msg, err := c.ReadMessage()
      if err != nil {
        log.Println("read:", err)
        break
      }
      log.Printf("recv: %s", msg)
      err = c.WriteMessage(mt, msg)
      if err != nil {
        log.Println("write:", err)
        break
      }
    }
  }))

  log.Fatal(app.Listen(":3000"))
  // ws://localhost:3000/ws
}

Server-Sent Events

📖 Більше інформації

import (
    "github.com/gofiber/fiber/v2"
    "github.com/valyala/fasthttp"
)

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

  app.Get("/sse", func(c *fiber.Ctx) error {
    c.Set("Content-Type", "text/event-stream")
    c.Set("Cache-Control", "no-cache")
    c.Set("Connection", "keep-alive")
    c.Set("Transfer-Encoding", "chunked")

    c.Context().SetBodyStreamWriter(fasthttp.StreamWriter(func(w *bufio.Writer) {
      fmt.Println("WRITER")
      var i int

      for {
        i++
        msg := fmt.Sprintf("%d - the time is %v", i, time.Now())
        fmt.Fprintf(w, "data: Message: %s\n\n", msg)
        fmt.Println(msg)

        w.Flush()
        time.Sleep(5 * time.Second)
      }
    }))

    return nil
  })

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

Recover middleware

📖 Recover

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("normally this would crash your app")
    })

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

Використання довіреного проксі

📖 Конфігурація

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

func main() {
    app := fiber.New(fiber.Config{
        EnableTrustedProxyCheck: true,
        TrustedProxies: []string{"0.0.0.0", "1.1.1.1/30"}, // IP address or IP address range
        ProxyHeader: fiber.HeaderXForwardedFor,
    })

    // ...

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

🧬 Внутрішні Middleware

Ось список middleware, яке входить до складу Fiber фреймворку.

Middleware Опис
basicauth Middleware який забезпечує базову автентифікацію по HTTP.
cache Middleware який перехоплює та кешує відповіді
compress стиснення для Fiber, воно за замовчуванням підтримує deflate, gzip і brotli.
cors Middleware який вмикає перехресне використання ресурсів (CORS) із різними параметрами.
csrf Захист від експлойтів CSRF.
encryptcookie Шифрування значень файлів cookie.
envvar Middleware для відкриття змінних середевищ.
etag Middleware яке робить кеш-пам’ять більш ефективним і заощаджує пропускну здатність, оскільки веб-серверу не потрібно повторно надсилати повну відповідь, якщо вміст не змінився.
expvar Middleware який обслуговує доступні варіанти середовища виконання HTTP у форматі JSON.
favicon Ігнорування значка із журналів або обслуговувати з пам’яті, якщо вказано шлях до файлу.
filesystem Middleware файлової системи, особлива подяка та кредити Alireza Salary.
limiter Ообмеження швидкості для Fiber. Використовуйте для обмеження повторних запитів до загальнодоступних API та/або кінцевих точок, таких як скидання пароля.
logger Реєстратор запитів/відповідей HTTP.
monitor Middleware який повідомляє показники сервера.
pprof Особлива подяка Метью Лі (@mthli) .
proxy Дозволяє надсилати проксі-запити до кількох серверів.
recover Middleware який відновлює паніки будь-де в ланцюжку стека та передає керування централізованому обробнику помилок.
requestid До кожного запиту додає ідентифікатор запиту.
session Middleware для сеансів. ПРИМІТКА: Цей middleware використовує наш пакет зберігання.
skip Middleware який пропускає упакований обробник, якщо предикат є істинним.
timeout Додає максимальний час для запиту та пересилає до ErrorHandler, якщо його перевищено.
keyauth Middleware для автентифікації по ключам.
redirect Middleware для перенаправлення.
rewrite Middleware для перезапису URL-адреси на основі наданих правил.
adaptor Конвентор для обробників net/http до/з обробників запитів Fiber, особлива подяка @arsmn!
helmet Допомагає захистити ваші програми, встановлюючи різні заголовки HTTP.

🧬 Зовнішні Middleware

Список зовнішніх middleware модулів, які підтримуються командою Fiber.

Middleware Опис
jwt JWT повертає middleware автентифікації JSON Web Token (JWT).
storage Драйвер зберігання який може використовуватися в різних middleware.
template Цей пакет містить 8 модулів шаблонів, які можна використовувати з Fiber v1.10.x Потрібно версія Go 1.13 або новішу.
websocket На основі Fasthttp WebSocket для Fiber з підтримкою місцевих користувачів!

🕶️ Чудовий список

Більше статей, middleware, прикладів або інструментів дивіться у нашому чудовому списку.

👍 Внести свій внесок

Якщо ви хочете сказати дякую та/або підтримати активний розвиток Fiber:

  1. Додайте зірку GitHub до проекту.
  2. Напишіть про проект у своєму 𝕏 (Twitter).
  3. Напишіть огляд або підручник на Medium, Dev.to або особистому блогу.
  4. Підтримайте проект, пожертвувавши чашку кави.

☕ Прихильники

Fiber – це проект із відкритим вихідним кодом, який працює за рахунок пожертвувань для оплати рахунків, наприклад наше доменне ім’я, gitbook, netlify і безсерверний хостинг. Якщо ви хочете підтримати Fiber, ви можете ☕ купити каву тут.

Користувач Пожертвування
@destari ☕ x 10
@dembygenesis ☕ x 5
@thomasvvugt ☕ x 5
@hendratommy ☕ x 5
@ekaputra07 ☕ x 5
@jorgefuertes ☕ x 5
@candidosales ☕ x 5
@l0nax ☕ x 3
@bihe ☕ x 3
@justdave ☕ x 3
@koddr ☕ x 1
@lapolinar ☕ x 1
@diegowifi ☕ x 1
@ssimk0 ☕ x 1
@raymayemir ☕ x 1
@melkorm ☕ x 1
@marvinjwendt ☕ x 1
@toishy ☕ x 1

‎‍💻 Автори коду

Code Contributors

⭐️ Звіздарі

Stargazers over time

⚠️ Ліцензія

Авторське право (c) 2019-дотепер Fenny та Contributors. Fiber це безкоштовне програмне забезпечення з відкритим вихідним кодом, ліцензоване згідно MIT License. Офіційний логотип створено Vic Shóstak і поширюється під Creative Commons ліцензією (CC BY-SA 4.0 International).

Ліцензії сторонніх бібліотек