این فصل به معرفی نحوه‌ی دریافت پارامترهای درخواست 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")
}