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 หรือโปรเจคใด ๆ ที่เป็นส่วนของระบบนี้ลำดับถัดไปตรวจสอบลำดับของสนามที่ผูกใบหน้า.