Fiber مستوحاة من إطار العمل Express الأكثر شعبية على الإنترنت. نجمع بين سهولة الاستخدام في Express و الأداء العالي في Go. إذا قمت ببناء تطبيق ويب باستخدام Node.js (باستخدام Express أو إطار عمل مماثل), فيجب أن تكون العديد من الأساليب والمبادئ سهلة للفهم بالنسبة لك.

البداية السريعة

التثبيت

تأكد من تثبيت Go 1.17 أو أحدث.

قم بتهيئة مشروعك عن طريق إنشاء مجلد وتشغيل الأمر go mod init github.com/your/repo داخل المجلد، ثم قم بتثبيت Fiber باستخدام أمر go get:

go get -u github.com/gofiber/fiber/v2

السلام عليكم

package main

// استيراد حزمة fiber
import "github.com/gofiber/fiber/v2"

func main() {
    // تعريف تطبيق fiber
    app := fiber.New()

    // تعريف مسار http
    app.Get("/", func(c *fiber.Ctx) error {
        // إرجاع "مرحبًا بالعالم" كسلسلة نصية
        return c.SendString("مرحبًا، عالم ?!")
    })

    // الاستماع على المنفذ 3000
    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"))
}

الوسيطة

تعزيز القدرة على معالجة طلبات HTTP من خلال الوسيطة.

func main() {
    app := fiber.New()

    // تطابق أي مسار، هنا تخصيص الوسيطة باستخدام دالة إغلاق
    app.Use(func(c *fiber.Ctx) error {
        fmt.Println("? المعالج الأول")
        // المتابعة في معالجة الوسيطة التالية أو دالة المسار
        return c.Next()
    })

    // تطابق المسارات التي تبدأ بـ /api
    app.Use("/api", func(c *fiber.Ctx) error {
        fmt.Println("? المعالج الثاني")
        return c.Next()
    })
    
    // استخدام الوسيطة المضمنة لمعالجة الاستثناءات
    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": "الصفحة الرئيسية",
            "year":  1999,
        })
    })

    log.Fatal(app.Listen(":3000"))
}

منافذ موارد الأصل المتعددة (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 "غير موجود"
    })

    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()
	// استخدام وسيطة الهلع لاعتراض استثناءات الهلع
    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، أو أي مشاريع أخرى تنتمي إلى نظام net/http.