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.