50 KiB
Fiber jest frameworkiem webowym inspirowanym javascriptowym frameworkiem Express. Został zbudowany na podstawie Fasthttp, najszybszym silniku HTTP powstałym w Go. Został zaprojektowany tak, aby ułatwić szybkie programowanie z myślą o wydajności oraz zerowej alokacji pamięci.
⚡️ Szybki start
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")
}
🤖 Testy wydajności
Testy te zostały przeprowadzone przez TechEmpower oraz Go Web. Jeżeli chcesz zobaczyć wszystkie wyniki, proszę, odwiedź naszą Wiki.
⚙️ Instalacja
Upewnij się, że masz zainstalowane Go (pobierz). Wymagana jest wersja 1.17
lub wyższa.
Zainicjalizuj swój projekt poprzez stworzenie folderu i użycie komendy go mod init github.com/your/repo
(zobacz więcej) w tym folderze. Następnie zainstaluj Fiber'a przy użyciu komendy go get
:
go get -u github.com/gofiber/fiber/v2
🎯 Funkcjonalności
- Stabilny routing
- Serwowanie pliki statyczne
- Ekstremalna wydajność
- Niskie zużycie pamięci
- Endpointy API
- Wsparcie Middleware oraz Next
- Szybkie programowanie po stronie servera
- Silniki szablonów HTML
- Wsparcie WebSocket
- Wydarzenia wysyłane przez serwer
- Rate Limiter
- Tłumaczenia w 20 językach
- Oraz wiele więcej, odkryj Fiber'a
💡 Nasza filozofia
Nowi gophersi, którzy przenoszą się z Node.js na Go, mierzą się z problemami nauczania, zanim będą mogli rozpocząć budowanie swoich aplikacji internetowych lub mikroserwisów. Fiber, jako framework, został stworzony z myślą o minimalizmie i podąża za filozofią UNIX, aby nowi programiści w Go mogli szybko wkroczyć do świata Go, ciesząc się serdecznym i godnym zaufania przyjęciem.
Fiber jest inspirowany javascriptowym frameworkiem Express, najpopularniejszym frameworkiem webowym w internecie. Połączyliśmy łatwość Express'a z czystą wydajnością Go. Jeżeli kiedykolwiek tworzyłeś aplikację webową w Node.js (korzystając z Express'a lub podobnych), wtedy wiele metod i zasad będzie dla ciebie bardzo znajomych.
Słuchamy naszych użytkowników w issues, na kanale Discord i wszędzie w Internecie, aby stworzyć szybki, elastyczny i przyjazny framework webowy dla Go, który nadaje się do wszelkich zadań, terminów i umiejętności programistów! Tak jak Express w świecie JavaScript.
⚠️ Ograniczenia
- Z uwagi na użycie unsafe przez Fiber'a, biblioteka nie zawsze będzie kompatybilna z najnowszą wersją Go. Fiber 2.40.0 został przetestowany z Go w wersjach 1.17 i 1.21.
- Fiber nie jest kompatybilny z interfejsami net/http. To oznacza, że nie będziesz w stanie korzystać (bezpośrednio) z projektów takich jak gqlgen, go-swagger lub innych, które są częścią ekosystemu net/http.
👀 Przykłady
Poniżej znajdują się niektóre przykłady. Jeśli chcesz zobaczyć więcej przykładów kodu, odwiedź nasze repozytorium Recipes lub odwiedź naszą dokumentację API.
📖 Podstawowy Routing
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"))
}
📖 Nazywanie Route'ów
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"))
}
📖 Serwowanie plików statycznych
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 i Next
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"))
}
📚 Pokaż więcej przykładów
Silniki widoków
Fiber domyślnie korzysta z html/template, kiedy nie wybrano żadnego silnika.
Jeżeli chcesz wykonywać lub korzystać z innego silnika jak amber, handlebars, mustache, pug itd. sprawdź naszą paczkę Template, która wspiera wiele silników widoków.
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"))
}
Grupowanie route'ów w łańcuchy
📖 Group
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 Logger
📖 Logger
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"))
}
Cross-Origin Resource Sharing (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"))
}
Sprawdź CORS poprzez przesłanie jakiejkolwiek domeny w nagłówku Origin
:
curl -H "Origin: http://example.com" --verbose http://localhost:3000
Niestandardowa odpowiedź 404
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"))
}
Odpowiedź 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"))
}
Dodanie 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
}
Wydarzenia wysyłane przez serwer
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"))
}
Middleware Recover
📖 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"))
}
Używanie zaufanego proxy
📖 Config
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"))
}
🧬 Wbudowane Middleware
Poniżej znajduje się lista middleware, które są zawarte wraz z frameworkiem Fiber.
Middleware | Opis |
---|---|
basicauth | Podstawowe middleware zapewniające podstawowe uwierzytelnienie HTTP. Wywołuje ono handler Next dla poprawnych danych uwierzytelniających oraz 401 Unauthorized dla niepoprawnych lub brakujacych danych. |
cache | Przechwytuje i cache'uje odpowiedzi |
compress | Middleware kompresji dla Fiber'a, podstawowo wspiera deflate , gzip i brotli . |
cors | Zezwala na cross-origin resource sharing CORS z wieloma opcjami konfiguracji. |
csrf | Chroni przed exploitami CSRF. |
encryptcookie | Middleware szyfrujące wartości ciasteczek. |
envvar | Odsłania zmienne środowiskowe oraz zapewnia dodatkową konfigurację. |
etag | Middleware ETag, które pozwala cache być bardziej wydajnym i oszczędzać transfer danych, jako, że serwer web nie musi wysyłać pełnej odpowiedzi, jeżeli dane się nie zmieniły. |
expvar | Middleware Expvar, które udostępnia warianty uruchomieniowe przez swój serwer HTTP, w formacie JSON |
favicon | Ignoruje favicony z logów lub serwuje je z pamięci, gdy ścieżka do pliku została podana |
filesystem | FileSystem middleware for Fiber, special thanks and credits to Alireza Salary |
limiter | Rate-limiting middleware for Fiber. Use to limit repeated requests to public APIs and/or endpoints such as password reset. |
logger | Logger zapytań/odpowiedzi HTTP. |
monitor | Middleware Monitor, które reportuje metryki serwera, inspirowane express-status-monitor |
pprof | Specjalne podziękowania dla Matthew Lee @mthli |
proxy | Pozwala ci przesyłać zapytania dalej do wielu serwerów |
recover | Middleware Recover przywraca działanie po wystąpieniu awarii w dowolnym miejscu w programie i przekazuje kontrolę do scentralizowanego typu ErrorHandler. |
requestid | Dodaje requestid do każdego zapytania. |
session | Middleware sesji. UWAGA: To middleware korzysta z naszej paczki Storage |
skip | Middleware skip, które pomija opakowany handler, jeżeli założona zasada jest spełniona |
rewrite | Middleware Rewrite przepisuje scieżkę URL bazując na podanych zasadach. Może być przydatne w przypadku potrzeby kompatybilności wstecznej lub po prostu tworzeniu czystszych i bardziej przejrzystych linków. |
timeout | Dodaje maksymalny czas dla zapytania i podaje go dalej do ErrorHandler, gdy limit został przekroczony. |
adaptor | Konwertuje handlery net/http do/z zapytania Fiber'a, specjalne podziękowania dla @arsmn! |
helmet | Pomaga zabezpieczyć twoją aplikację poprzez ustawianie wielu nagłówków HTTP. |
redirect | Middleware przekierowywujące |
keyauth | Middleware Key auth zapewnia uwierzytelnienie na podstawie klucza. |
🧬 Zewnętrzne middleware
Lista zewnętrznie hostowanych modułów middleware i utrzymywanych przez zpesół Fiber'a.
Middleware | Description |
---|---|
jwt | JWT returns a JSON Web Token JWT auth middleware. |
storage | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
template | This package contains 8 template engines that can be used with Fiber v1.10.x Go version 1.13 or higher is required. |
websocket | Based on Fasthttp WebSocket for Fiber with Locals support! |
🕶️ Awesome List
Po więcej artykułów, middleware, przykładów lub narzędzi sprawdź naszą awesome list.
👍 Wspomaganie
Jeżeli chcesz podziękować i/lub wesprzeć aktywny rozwój Fiber'a
:
- Dodaj Gwiazdkę GitHub dla tego projektu.
- Zatweetuj o tym projekcie na twoim 𝕏 (Twitter).
- Napisz recenzję lub tutorial na Medium, Dev.to lub personalnym blogu.
- Wesprzyj projekt, przekazując darowiznę w postaci filiżanki kawy.
☕ Wspierający
Fiber to projekt open source, który działa dzięki darowiznom, aby pokryć koszty, takie jak nasza nazwa domeny, GitBook, Netlify oraz hosting serverless. Jeśli chcesz wesprzeć Fiber, możesz ☕ tutaj kupić kawę.
Użytkownik | Dotacja | |
---|---|---|
@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 |
💻 Współtwórcy projektu
⭐️ Obserwujący projekt
⚠️ Licencja
Copyright (c) 2019-present Fenny and Contributors. Fiber
is free and open-source software licensed under the MIT License. Official logo was created by Vic Shóstak and distributed under Creative Commons license (CC BY-SA 4.0 International).
Licencje bibliotek od innych twórców