این فصل به معرفی نحوهی دریافت پارامترهای درخواست GET، POST و دیگر درخواستها در چارچوب iris میپردازد، شامل خواندن و نوشتن کوکیها.
پارامترها در مسیر
func main() {
app := iris.Default()
// این دستگیرنده با /user/john تطابق پیدا میکند، اما با /user/ یا /user تطابق پیدا نمیکند
app.Get("/user/{name}", func(ctx iris.Context) {
name := ctx.Params().Get("name")
ctx.Writef("سلام %s", name)
})
// با این حال، این دستگیرنده با /user/john/ و /user/john/send تطابق پیدا میکند
// اگر هیچ مسیر دیگری با /user/john تطابق پیدا نکند، به /user/john/ هدایت میشود
app.Get("/user/{name}/{action:path}", func(ctx iris.Context) {
name := ctx.Params().Get("name")
action := ctx.Params().Get("action")
message := name + " " + action + " است"
ctx.WriteString(message)
})
// برای هر درخواست تطابقیافته، محیط متناسب با تعریف مسیر را نگه میدارد
app.Post("/user/{name:string}/{action:path}", func(ctx iris.Context) {
ctx.GetCurrentRoute().Tmpl().Src == "/user/{name:string}/{action:path}" // درست است
})
app.Listen(":8080")
}
انواع پارامترهای موجود به صورت پیشفرض:
نوع پارامتر | نوع Go | اعتبارسنجی | تابع کمکی دسترسی |
---|---|---|---|
:string |
string | هر محتوا (یک بخش مسیر تک) | Params().Get |
:uuid |
string | uuidv4 یا v1 (یک بخش مسیر) | Params().Get |
:int |
int | -9223372036854775808 تا 9223372036854775807 (x64) یا -2147483648 تا 2147483647 (x32)، بسته به معماری میزبان | Params().GetInt |
:int8 |
int8 | -128 تا 127 | Params().GetInt8 |
:int16 |
int16 | -32768 تا 32767 | Params().GetInt16 |
:int32 |
int32 | -2147483648 تا 2147483647 | Params().GetInt32 |
:int64 |
int64 | -9223372036854775808 تا 9223372036854775807 | Params().GetInt64 |
:uint |
uint | 0 تا 18446744073709551615 (x64) یا 0 تا 4294967295 (x32)، بسته به معماری میزبان | Params().GetUint |
:uint8 |
uint8 | 0 تا 255 | Params().GetUint8 |
:uint16 |
uint16 | 0 تا 65535 | Params().GetUint16 |
:uint32 |
uint32 | 0 تا 4294967295 | Params().GetUint32 |
:uint64 |
uint64 | 0 تا 18446744073709551615 | Params().GetUint64 |
:bool |
bool | "1" یا "t" یا "T" یا "TRUE" یا "true" یا "True" یا "0" یا "f" یا "F" یا "FALSE" یا "false" یا "False" | Params().GetBool |
:alphabetical |
string | حروف کوچک یا بزرگ | Params().Get |
:file |
string | حروف کوچک یا بزرگ، اعداد، زیرخط (_)، خط تیره (-)، نقطه (.)، نمیتواند شامل فاصله یا سایر نویسههای خاص نام فایل غیرمعتبر باشد | Params().Get |
:path |
string | هر محتوا، میتواند توسط خطوط (بخشهای مسیر) جدا شود، اما باید آخرین بخش از مسیر مسیر باشد | Params().Get |
:mail |
string | آدرس ایمیل، دامنه بررسی نمیشود | Params().Get |
:email |
string | آدرس ایمیل، دامنه بررسی شده | Params().Get |
:date |
string | قالب yyyy/mm/dd. به عنوان مثال /blog/{param:date} با /blog/2022/04/21 تطابق مییابد | Params().GetTime و Params().SimpleDate |
:weekday |
uint (0-6) یا string | رشته باید یک ثابت time.Weekday ("sunday" تا "monday" یا "Sunday" تا "Monday") باشد، به عنوان مثال /schedule/{param:weekday} با /schedule/monday تطابق مییابد | Params().GetWeekday |
دریافت پارامترهای Query
func main() {
app := iris.Default()
// استفاده از شیء درخواست سطح پایین موجود برای تحلیل پارامترهای رشتهی پرسوجو
// آدرس درخواست: /welcome?firstname=Jane&lastname=Doe
app.Get("/welcome", func(ctx iris.Context) {
firstname := ctx.URLParamDefault("firstname", "Guest")
lastname := ctx.URLParam("lastname") // میانبر برای ctx.Request().URL.Query().Get("lastname")
ctx.Writef("سلام %s %s", firstname, lastname)
})
app.Listen(":8080")
}
دریافت پارامترهای فرم
func main() {
app := iris.Default()
app.Post("/form_post", func(ctx iris.Context) {
message := ctx.PostValue("message")
nick := ctx.PostValueDefault("nick", "Anonymous")
ctx.JSON(iris.Map{
"وضعیت": "منتشر شده",
"پیام": message,
"ناممستعار": nick,
})
})
app.Listen(":8080")
}
مثال ترکیبی از دریافت پارامترهای Query + فرم
POST /post?id=1234&page=1 HTTP/1.1
Content-Type: application/x-www-form-urlencoded
name=kataras&message=this_is_great
func main() {
app := iris.Default()
app.Post("/post", func(ctx iris.Context) {
id, err := ctx.URLParamInt("id", 0)
if err != nil {
ctx.StopWithError(iris.StatusBadRequest, err)
return
}
page := ctx.URLParamIntDefault("page", 0)
name := ctx.PostValue("name")
message := ctx.PostValue("message")
ctx.Writef("آیدی: %d; صفحه: %d; نام: %s; پیام: %s", id, page, name, message)
})
app.Listen(":8080")
}
آیدی: 1234; صفحه: 1; نام: kataras; پیام: this_is_great
دریافت پارامترهای Query در یک درخواست POST
POST /post?id=a&id=b&id=c&name=john&name=doe&name=kataras
Content-Type: application/x-www-form-urlencoded
func main() {
app := iris.Default()
app.Post("/post", func(ctx iris.Context) {
ids := ctx.URLParamSlice("id")
names, err := ctx.PostValues("name")
if err != nil {
ctx.StopWithError(iris.StatusBadRequest, err)
return
}
ctx.Writef("آیدیها: %v; نامها: %v", ids, names)
})
app.Listen(":8080")
}
آیدیها: [a b c], نامها: [john doe kataras]
خواندن/نوشتن کوکی
import "github.com/kataras/iris/v12"
func main() {
app := iris.Default()
app.Get("/cookie", func(ctx iris.Context) {
// خواندن کوکی
value := ctx.GetCookie("my_cookie")
if value == "" {
value = "ثبت نشده"
// ساختن کوکی
ctx.SetCookieKV("my_cookie", value)
// به صورت جایگزینی: ctx.SetCookie(&http.Cookie{...})
// ساختن کوکی
ctx.SetCookie("", "test", 3600, "/", "localhost", false, true)
}
ctx.Writef("مقدار کوکی: %s \n", value)
})
app.Listen(":8080")
}