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
- Надійна маршрутизація
- Доступ до статичних файлів
- Екстремальна продуктивність
- Низький обсяг споживання пам'яті
- Кінцеві точки API
- Middleware та підтримка Next
- Швидке програмування на стороні сервера
- Двигуни шаблонів
- Підтримка WebSocket
- Server-Sent Events
- Обмежувач швидкості
- Документація доступна 19 мовами
- І багато іншого, відвідайте наш Wiki
Нові програмісти, які переходять із 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
// ...
}
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
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
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
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"))
}
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
}
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
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, яке входить до складу 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 модулів, які підтримуються командою 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
:
- Додайте зірку GitHub до проекту.
- Напишіть про проект у своєму 𝕏 (Twitter).
- Напишіть огляд або підручник на Medium, Dev.to або особистому блогу.
- Підтримайте проект, пожертвувавши чашку кави.
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 |
Авторське право (c) 2019-дотепер Fenny та Contributors. Fiber
це безкоштовне програмне забезпечення з відкритим вихідним кодом, ліцензоване згідно MIT License. Офіційний логотип створено Vic Shóstak і поширюється під Creative Commons ліцензією (CC BY-SA 4.0 International).
Ліцензії сторонніх бібліотек