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.
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 te zostały przeprowadzone przez TechEmpower oraz Go Web. Jeżeli chcesz zobaczyć wszystkie wyniki, proszę, odwiedź naszą Wiki.
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
- 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
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.
- 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.
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.
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"))
}
📚 Pokaż więcej przykładó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"))
}
📖 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
// ...
}
📖 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"))
}
📖 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
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"))
}
📖 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"))
}
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. |
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! |
Po więcej artykułów, middleware, przykładów lub narzędzi sprawdź naszą awesome list.
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.
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 |
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