فایبر الهام گرفته شده از محبوب‌ترین چهارچوب وب به نام 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 {
        // ارسال رشته "Hello, World ?!" به عنوان خروجی
        return c.SendString("Hello, World ?!")
    })

    // گوش کردن به پورت 3000
    app.Listen(":3000")
}

دسترسی از طریق: http://localhost:3000/

مسیریابی ابتدایی

نمونه مسیریابی ابتدایی Fiber

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

    // دریافت /api/register
    app.Get("/api/*", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("✋ %s", c.Params("*"))
        return c.SendString(msg) // => ✋ register
    })

    // دریافت /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
    })

    // دریافت /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
    })

    // دریافت /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 ساله است.
    })

    // دریافت /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"))
}

میان‌افزار

تقویت توانایی بررسی درخواست‌های اچ‌تی‌تی‌پی از طریق میان‌افزار.

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

    // سازماندهی میان هر مسیر، اینجا میان‌افزار را با استفاده از تابع نشاندهی سفارشی سفارشی کنید
    app.Use(func(c *fiber.Ctx) error {
        fmt.Println("? First handler")
        // ادامه دادن به بررسی میان‌افزار بعدی یا تابع مسیر
        return c.Next()
    })

    // مطابقت مسیرها با شروع /api
    app.Use("/api", func(c *fiber.Ctx) error {
        fmt.Println("? Second handler")
        return c.Next()
    })
    
    // استفاده از میان‌افزار مدیریت استثناها
    app.Use(recover.New())

    // دریافت /api/register
    app.Get("/api/list", func(c *fiber.Ctx) error {
        fmt.Println("? Last handler")
        return c.SendString("Hello, World ?!")
    })

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

موتور قالب

اگر موتور قالب تنظیم نشود، Fiber به طور پیش فرض از html/template استفاده می‌کند.

بسته‌ی اصلی

واردات (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/template/pug"
)

تابع اصلی() {
    // تنظیم موتور قالب
    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 کمک کند.

واردات (
    "log"
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/cors"
)

تابع اصلی() {
    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

پاسخ سفارشی ۴۰۴

تابع اصلی() {
    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("خوش آمدید!")
    })

    // آخرین میان‌افزار مورد اشاره، با درخواست‌ها، شامل ۴۰۴ خواهد شد
    app.Use(func(c *fiber.Ctx) error {
        // منطق دیگر
        // بازگشت وضعیت ۴۰۴
        return c.SendStatus(404)
        // => 404 "یافت نشد"
    })

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

پاسخ JSON

مثالی از Fiber برگرداندن داده JSON.

نوع کاربر struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

تابع اصلی() {
    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"))
}

میان‌افزار بازیابی

جلوگیری از برنامه کرش و خروج با انتزاع خطاهای پانیک.

واردات (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/recover"
)

تابع اصلی() {
    app := fiber.New()
    // استفاده از میان‌افزار پانیک برای انتزاع استثناهای پانیک
    app.Use(recover.New())

    app.Get("/", func(c *fiber.Ctx) error {
        panic("معمولاً این باعث کرش کردن برنامه شما خواهد bشد")
    })

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

محدودیت‌ها

  • به دلیل استفاده از ویژگی‌های ناامن در Fiber، ممکن است با آخرین نسخه‌های Go ناسازگار باشد. Fiber 2.40.0 بر روی نگارش‌های Go 1.17 تا 1.21 آزمایش شده است.
  • Fiber با رابط net/http سازگار نیست. این بدان معناست که نمی‌توانید به طور مستقیم از پروژه‌هایی مانند gqlgen، go-swagger، یا هر پروژه دیگری که به اکوسیستم net/http تعلق دارد، استفاده کنید.