Fiber
được truyền cảm hứng từ framework Express
phổ biến nhất trên Internet. Chúng tôi kết hợp tính dễ sử dụng của Express
và hiệu suất tốt của Go
. Nếu bạn đã từng xây dựng ứng dụng Web
bằng Node.js
(sử dụng Express hoặc framework tương tự), thì rất nhiều phương pháp và nguyên tắc sẽ rất dễ hiểu với bạn.
Bắt đầu nhanh
Cài đặt
Hãy đảm bảo bạn đã cài đặt Go 1.17
trở lên.
Khởi tạo dự án của bạn bằng cách tạo một thư mục và chạy lệnh go mod init github.com/your/repo
trong thư mục đó, sau đó cài đặt Fiber bằng lệnh go get
:
go get -u github.com/gofiber/fiber/v2
Xin chào Thế Giới
package main
// Nhập gói fiber
import "github.com/gofiber/fiber/v2"
func main() {
// Định nghĩa ứng dụng fiber
app := fiber.New()
// Định nghĩa route http
app.Get("/", func(c *fiber.Ctx) error {
// Trả về chuỗi "Hello, World ?!"
return c.SendString("Xin chào, Thế Giới ?!")
})
// Lắng nghe trên cổng 3000
app.Listen(":3000")
}
Truy cập qua: http://localhost:3000/
Định tuyến Cơ bản
Ví dụ về định tuyến cơ bản của 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("? Từ: %s, Đến: %s", c.Params("from"), c.Params("to"))
return c.SendString(msg) // => ? Từ: LAX, Đến: 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 tuổi", c.Params("name"), c.Params("age"))
return c.SendString(msg) // => ? john is 75 tuổi
})
// GET /john
app.Get("/:name", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("Xin chào, %s ?!", c.Params("name"))
return c.SendString(msg) // => Xin chào john ?!
})
log.Fatal(app.Listen(":3000"))
}
Phục vụ Tập tin Tĩnh
Cấu hình phục vụ tập tin tĩnh
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
Tăng cường khả năng xử lý yêu cầu HTTP thông qua middleware.
func main() {
app := fiber.New()
// Khớp với bất kỳ route nào, ở đây tùy chỉnh middleware bằng cách sử dụng một hàm gói ghém (closure)
app.Use(func(c *fiber.Ctx) error {
fmt.Println("? Xử lý đầu tiên")
// Tiếp tục xử lý middleware hoặc hàm route kế tiếp
return c.Next()
})
// Khớp với các route bắt đầu bằng /api
app.Use("/api", func(c *fiber.Ctx) error {
fmt.Println("? Xử lý thứ hai")
return c.Next()
})
// Sử dụng middleware tích hợp sẵn để xử lý ngoại lệ
app.Use(recover.New())
// GET /api/register
app.Get("/api/list", func(c *fiber.Ctx) error {
fmt.Println("? Xử lý cuối cùng")
return c.SendString("Xin chào, Thế Giới ?!")
})
log.Fatal(app.Listen(":3000"))
}
Bộ Động Cơ Mẫu
Nếu bộ động cơ mẫu không được thiết lập, Fiber
mặc định sử dụng html/template.
package main
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/template/pug"
)
func main() {
// Thiết lập bộ động cơ mẫu
app := fiber.New(fiber.Config{
Views: pug.New("./views", ".pug"),
})
app.Get("/", func(c *fiber.Ctx) error {
// Render bộ mẫu ./views/home.pug bằng cách sử dụng các tham số mẫu fiber.map
return c.Render("home", fiber.Map{
"title": "Trang chủ",
"year": 1999,
})
})
log.Fatal(app.Listen(":3000"))
}
Phần Mềm Trung Gian Chia Sẻ Tài Nguyên (CORS)
Phần mềm trung gian cho CORS trong Fiber, có thể kích hoạt chia sẻ tài nguyên gốc với các tùy chọn khác nhau để ngăn chặn các cuộc tấn công CORS.
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
)
func main() {
app := fiber.New()
// Cấu hình CORS mặc định
app.Use(cors.New())
// Hoặc tùy chỉnh tham số CORS để cho phép yêu cầu từ một số miền nhất định
app.Use(cors.New(cors.Config{
AllowOrigins: "https://www.tizi365.com, https://tizi365.com",
AllowHeaders: "Origin, Content-Type, Accept",
}))
log.Fatal(app.Listen(":3000"))
}
Kiểm tra CORS bằng cách chuyển bất kỳ miền nào trong tiêu đề Origin
:
curl -H "Origin: https://www.tizi365.com" --verbose http://localhost:3000
Phản Hồi 404 Tùy Chỉnh
func main() {
app := fiber.New()
app.Static("/", "./public")
app.Get("/demo", func(c *fiber.Ctx) error {
return c.SendString("Đây là bản demo!")
})
app.Post("/register", func(c *fiber.Ctx) error {
return c.SendString("Chào mừng!")
})
// Các đoạn trung gian cuối cùng sẽ khớp với tất cả các yêu cầu, bao gồm cả 404
app.Use(func(c *fiber.Ctx) error {
// Logic xử lý khác
// Trả về trạng thái 404
return c.SendStatus(404)
// => 404 "Không tìm thấy"
})
log.Fatal(app.Listen(":3000"))
}
Phản Hồi JSON
Ví dụ về Fiber trả về dữ liệu 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": "Xin chào John!",
})
// => {"success":true, "message":"Xin chào John!"}
})
log.Fatal(app.Listen(":3000"))
}
Phần Mềm Trung Gian Khôi Phục
Chặn lỗi panic để ngăn chương trình bị sập và thoát.
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
)
func main() {
app := fiber.New()
// Sử dụng phần mềm trung gian panic để chặn các ngoại lệ panic
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
panic("thông thường điều này sẽ làm sập ứng dụng của bạn")
})
log.Fatal(app.Listen(":3000"))
}
Sự đo lường
[
Hạn chế
- Do sử dụng các tính năng không an toàn trong Fiber, có thể không tương thích với các phiên bản Go mới nhất. Fiber 2.40.0 đã được kiểm tra trên các phiên bản Go từ 1.17 đến 1.21.
- Fiber không tương thích với giao diện net/http. Điều này có nghĩa là bạn không thể trực tiếp sử dụng các dự án như gqlgen, go-swagger, hoặc bất kỳ dự án nào khác thuộc hệ sinh thái net/http.