Fiber
ได้รับแรงบันดาลใจมาจากเฟรมเวิร์ก Express
ที่ได้รับความนิยมสูงสุดในอินเทอร์เน็ต โดยทีมพัฒนาผสานความ สะดวก จาก Express
และ ประสิทธิภาพ ที่มีอยู่ของ Go
เข้าด้วยกัน หากเคยสร้างแอปพลิเคชัน Web
โดยใช้ Node.js
(โดยใช้ Express หรือเฟรมเวิร์กที่คล้ายกัน) ก็ควรจะเข้าใจหลักการและเมทอดต่าง ๆ ได้ง่ายมาก
การเริ่มต้นอย่างรวดเร็ว
การติดตั้ง
ตรวจสอบให้แน่ใจว่ามี Go เวอร์ชัน 1.17
หรือสูงกว่า ติดตั้งอยู่ในเครื่อง
เริ่มโปรเจกต์ของคุณโดยการสร้างโฟลเดอร์และรันคำสั่ง go mod init github.com/your/repo
ภายในโฟลเดอร์ จากนั้นติดตั้ง Fiber โดยใช้คำสั่ง go get
:
go get -u github.com/gofiber/fiber/v2
Hello World
package main
// นำเข้าแพ็กเกจของ fiber
import "github.com/gofiber/fiber/v2"
func main() {
// นิยามแอปพลิเคชันของ fiber
app := fiber.New()
// นิยามเส้นทาง HTTP
app.Get("/", func(c *fiber.Ctx) error {
// ส่งคืนข้อความ "Hello, World ?!" เป็นสตริง
return c.SendString("Hello, World ?!")
})
// ฟังก์ชันหลังการทำงาน
app.Listen(":3000")
}
เข้าถึงผ่าน: http://localhost:3000/
เส้นทางพื้นฐาน
ตัวอย่างการเส้นทางพื้นฐานของ 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("? จาก: %s, ไปยัง: %s", c.Params("from"), c.Params("to"))
return c.SendString(msg) // => ? จาก: LAX, ไปยัง: 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 มีอายุ %s ปี", c.Params("name"), c.Params("age"))
return c.SendString(msg) // => ? john มีอายุ 75 ปี
})
// GET /john
app.Get("/:name", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("สวัสดี, %s ?!", c.Params("name"))
return c.SendString(msg) // => สวัสดี john ?!
})
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"))
}
Middleware
เสริมความสามารถในการจัดการคำขอ HTTP ผ่าน middleware
func main() {
app := fiber.New()
// ตรงกันตามเส้นทางใดก็ได้, ที่นี่เพิ่ม middleware ที่กำหนดเองโดยใช้ฟังก์ชันเชิงปิด
app.Use(func(c *fiber.Ctx) error {
fmt.Println("? แฮนด์เลอร์ครั้งแรก")
// ดำเนินการต่อในการจัดการ middleware หรือ ฟังก์ชันเส้นทางถัดไป
return c.Next()
})
// ตรงกันตามเส้นทางเริ่มต้นด้วย /api
app.Use("/api", func(c *fiber.Ctx) error {
fmt.Println("? แฮนด์เลอร์ครั้งที่สอง")
return c.Next()
})
// ใช้ middleware ที่มีอยู่อย่างในช่วยในการจัดการข้อยกเว้น
app.Use(recover.New())
// GET /api/register
app.Get("/api/list", func(c *fiber.Ctx) error {
fmt.Println("? แฮนด์เลอร์ครั้งสุดท้าย")
return c.SendString("สวัสดี, โลก ?!")
})
log.Fatal(app.Listen(":3000"))
}
โมดูลเทมเพลต
หากเทมเพลตเอนจินไม่ได้ถูกกำหนดไว้ Fiber
จะใช้ html/template เป็นค่าเริ่มต้น
package main
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/template/pug"
)
func main() {
// กำหนดเทมเพลตเอนจิน
app := fiber.New(fiber.Config{
Views: pug.New("./views", ".pug"),
})
app.Get("/", func(c *fiber.Ctx) error {
// เรียกใช้เทมเพลต ./views/home.pug โดยใช้พารามิเตอร์เทมเพลตของ fiber.map
return c.Render("home", fiber.Map{
"title": "Homepage",
"year": 1999,
})
})
log.Fatal(app.Listen(":3000"))
}
มิดเดิลแวร์ Cross-Origin Resource Sharing (CORS)
มิดเดิลแวร์สำหรับ CORS ใน Fiber สามารถเปิดใช้งานการแบ่งการแบ่งทราบข้ามกฎบางแบบเพื่อป้องกันการโจมตี CORS
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
)
func main() {
app := fiber.New()
// กำหนดค่าเริ่มต้นของ CORS
app.Use(cors.New())
// หรือกำหนดพารามิเตอร์ของ CORS เพื่ออนุญาตให้ร้องขอจากโดเมนบางอย่าง
app.Use(cors.New(cors.Config{
AllowOrigins: "https://www.tizi365.com, https://tizi365.com",
AllowHeaders: "Origin, Content-Type, Accept",
}))
log.Fatal(app.Listen(":3000"))
}
ตรวจสอบ CORS โดยใส่โดเมนใด ๆ ในส่วนหัว Origin
:
curl -H "Origin: https://www.tizi365.com" --verbose http://localhost:3000
การตอบสนองแบบกำหนดเอง 404
func main() {
app := fiber.New()
app.Static("/", "./public")
app.Get("/demo", func(c *fiber.Ctx) error {
return c.SendString("นี่คือเดโม!")
})
app.Post("/register", func(c *fiber.Ctx) error {
return c.SendString("ยินดีต้อนรับ!")
})
// มิดเดิลแวร์ที่ถูกอ้างถึงครั้งสุดท้ายจะตรงกับคำขอทั้งหมด รวมถึง 404
app.Use(func(c *fiber.Ctx) error {
// ตรรกะการจัดการอื่น ๆ
// ส่งสถานะ 404
return c.SendStatus(404)
// => 404 "Not Found"
})
log.Fatal(app.Listen(":3000"))
}
การตอบสนองแบบ JSON
ตัวอย่างของ Fiber ที่ตอบสนองด้วยข้อมูล 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": "สวัสดี จอห์น!",
})
// => {"success":true, "message":"สวัสดี จอห์น!"}
})
log.Fatal(app.Listen(":3000"))
}
มิดเดิลแวร์การกู้คืน
แอพอินเทออุบัติเหตุเพื่อป้องกันการล่มและปิดโปรแกรม
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
)
func main() {
app := fiber.New()
// ใช้มิดเดิลแวร์ panic เพื่อมีการก้ป้องกันข้อยกเว้นพานิก
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
panic("ปกติแล้ว สิ่งนี้จะทำให้แอพของคุณล่ม")
})
log.Fatal(app.Listen(":3000"))
}
การทดสอบ
[
ข้อจำกัด
- เนื่องจากใช้คุณสมบัติที่ไม่ปลอดภัยใน Fiber อาจไม่สามารถทำงานร่วมกับเวอร์ชันของ Go ล่าสุดได้ Fiber 2.40.0 ได้ทดสอบด้วย Go เวอร์ชัน 1.17 ถึง 1.21
- Fiber ไม่สามารถใช้งานร่วมกับอินเตอร์เฟซ net/http นี่หมายความว่าคุณไม่สามารถใช้โปรเจคเช่น gqlgen, go-swagger หรือโปรเจคใด ๆ ที่เป็นส่วนของระบบนี้ลำดับถัดไปตรวจสอบลำดับของสนามที่ผูกใบหน้า.