رفع پارامترهای درخواست در فریمورک 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"
// ...
})