رفع پارامترهای درخواست در فریمورک Go Fiber

مثال ساده

همهٔ پارامترهای درخواست در فریمورک Fiber از طریق شی Ctx دریافت می‌شوند.

app.Get("/user/:name?", func(c *fiber.Ctx) error {
    // از طریق پارامتر Ctx تابع مسیر، پارامترها را دریافت کنید و متد مناسب را صدا بزنید
    // در اینجا، پارامتر name از طریق Params دریافت می‌شود
    return c.SendString(c.Params("name"))
})

دریافت پارامترهای مسیر

دریافت پارامترها از مسیر URL

// GET http://example.com/user/fenny
app.Get("/user/:name", func(c *fiber.Ctx) error {
  c.Params("name") // "fenny"

  // ...
})

// GET http://example.com/user/fenny/123
app.Get("/user/*", func(c *fiber.Ctx) error {
  c.Params("*")  // "fenny/123"
  c.Params("*1") // "fenny/123"
  
  c.Params("*", "مقدار پیش‌فرض")  // مقدار پیش‌فرض می‌تواند با پارامتر دوم تعیین شود
})

دریافت پارامترهای نوع Int مسیر

// GET http://example.com/user/123
app.Get("/user/:id", func(c *fiber.Ctx) error {
  id, err := c.ParamsInt("id") // int 123 و هیچ خطا 

  // ...
})

دریافت پارامترهای درخواست GET

// GET http://example.com/?order=desc&brand=nike
app.Get("/", func(c *fiber.Ctx) error {
  c.Query("order")         // "desc"
  c.Query("brand")         // "nike"
  // می‌توان از پارامتر دوم برای تعیین مقدار پیش‌فرض استفاده کرد که در صورت عدم وجود پارامتر برگردانده می‌شود
  c.Query("empty", "nike") // "nike"

  // ...
})

برگرداندن همهٔ پارامترهای کوئری

// GET http://example.com/?name=alex&want_pizza=false&id=
app.Get("/", func(c *fiber.Ctx) error {
    m := c.Queries()
    m["name"]        // "alex"
    m["want_pizza"]  // "false"
    m["id"]          // ""
    // ...
})

بایند کردن پارامترهای کوئری به یک شیء ساختاری

// تعریف یک ساختار برای دریافت پارامترها
// از برچسب query برای تعیین نام پارامترها برای بایند کردن استفاده شده است
type Person struct {
    Name     string     `query:"name"`
    Pass     string     `query:"pass"`
    Products []string   `query:"products"`
}

app.Get("/", func(c *fiber.Ctx) error {
        // تعریف متغیر ساختاری برای دریافت پارامترها
        p := new(Person)

        // برای بایند کردن پارامترهای کوئری به متغیر p از QueryParser استفاده کنید
        if err := c.QueryParser(p); err != nil {
            return err
        }

        log.Println(p.Name)     // john
        log.Println(p.Pass)     // doe
        log.Println(p.Products) // [shoe, hat]

        // ...
})
// برای آزمایش، دستور curl زیر را اجرا کنید
// curl "http://localhost:3000/?name=john&pass=doe&products=shoe,hat"

دریافت پارامترهای فرم درخواست POST

app.Post("/", func(c *fiber.Ctx) error {
  // بدست آوردن اولین مقدار از زمینهٔ فرم "name":
  c.FormValue("name")
  // => "john" یا "" اگر وجود نداشته باشد

  // ...
})

پردازش پارامترهای بدنه

این در اصل برای پردازش درخواست‌های POST/PUT به کار می‌رود و از JSON، XML و پارامترهای فرم پشتیبانی می‌کند.

// تعریف ساختار برای دریافت پارامترها و تعریف نام‌های فیلد پارامتری که از طریق برچسب‌های json، xml و form می‌خواهید دریافت کنید
// json، xml، form می‌تواند به‌صورت دلخواه انتخاب شود؛ لزومی برای اضافه کردن همه آنها وجود ندارد
type Person struct {
    Name string `json:"name" xml:"name" form:"name"`
    Pass string `json:"pass" xml:"pass" form:"pass"`
}

app.Post("/", func(c *fiber.Ctx) error {
    // تعریف یک متغیر ساختار برای دریافت پارامترها
    p := new(Person)

    // استفاده از BodyParser برای پیوند دادن پارامترهای بدنه به متغیر p
    if err := c.BodyParser(p); err != nil {
        return err
    }

    log.Println(p.Name) // john
    log.Println(p.Pass) // doe

    // ...
})

// نمونه‌هایی از انواع مختلف درخواست‌ها؛ برای درخواست‌های پارامتر فرمت JSON، به یاد داشته باشید که Content-Type را برابر با application/json تنظیم کنید

// curl -X POST -H "Content-Type: application/json" --data "{\"name\":\"john\",\"pass\":\"doe\"}" localhost:3000

// curl -X POST -H "Content-Type: application/xml" --data "<login><name>john</name><pass>doe</pass></login>" localhost:3000

// curl -X POST -H "Content-Type: application/x-www-form-urlencoded" --data "name=john&pass=doe" localhost:3000

// curl -X POST -F name=john -F pass=doe http://localhost:3000

// curl -X POST "http://localhost:3000/?name=john&pass=doe"

نحوه بازیابی داده بدنه اصلی به شرح زیر است:

// curl -X POST http://localhost:8080 -d user=john

app.Post("/", func(c *fiber.Ctx) error {
  // استفاده از BodyRaw برای بازگرداندن داده بدنه خام
  return c.Send(c.BodyRaw()) // []byte("user=john")
})

بازیابی هدرهای درخواست

app.Get("/", func(c *fiber.Ctx) error {
  c.Get("Content-Type")       // "text/plain"
  c.Get("CoNtEnT-TypE")       // "text/plain"
  c.Get("something", "john")  // "john"
  // ...
})

بازیابی IP مشتری

app.Get("/", func(c *fiber.Ctx) error {
  c.IP() // "127.0.0.1"

  // ...
})

اگر بر روی یک سروری که از طریق پروکسی یا بارگذار توزیع شده است استقرار یابد، باید از طریق هدر x-forwarded-for ای پی مشتری را بازیابی کنید.

app := fiber.New(fiber.Config{
  ProxyHeader: fiber.HeaderXForwardedFor,
})

خواندن کوکی‌ها

app.Get("/", func(c *fiber.Ctx) error {
  // گرفتن کوکی براساس کلید:
  c.Cookies("name")         // "john"
  c.Cookies("empty", "doe") // "doe"
  // ...
})