فریمورک iris دارای دو حالت برای اتصال مسیر (Route Binding) می‌باشد، یکی حالت تابعی و دیگری MVC است. حالت تابعی یک تابع پردازشی را به یک مسیر URL مشخص متصل می‌کند، در حالی که حالت MVC یک کنترل‌کننده را به یک مسیر URL متصل می‌کند. این فریمورک براساس قوانین نام‌گذاری متدهای کنترل‌کننده، به طور خودکار مسیر URL متناظر را ایجاد می‌کند و توابع کنترل‌کننده متناسب را به طور خودکار متصل می‌کند.

اتصال تابعی مسیر

ساده‌ترین مدل مسیریابی در فریمورک iris است، جایی که می‌توانید یک تابع را به هر URL متصل کنید.

func main() {
    // ایجاد یک برنامه iris با middleware پیش‌فرض:
    // به طور پیش‌فرض، از سطح ورودی "debug" استفاده می‌کند.
    // از بومی‌سازی واقع در دایرکتوری "./locales" پشتیبانی می‌کند.
    // قالب‌های HTML در دایرکتوری‌های "./views" یا "./templates" قرار دارند.
    // لاگ‌های دسترسی در "./access.log" ذخیره می‌شوند،
    // و middleware بازیابی (بدون خطا) و شناسه درخواست به طور خودکار پیوسته شده‌اند.
    app := iris.Default()

	// به سادگی توابع مسیر را براساس متد درخواست HTTP و مسیر متصل می‌کند، مشابه مکانیزم مسیریابی در Gin، echo و فریمورک‌های دیگر.
    app.Get("/someGet", getting)
    app.Post("/somePost", posting)
    app.Put("/somePut", putting)
    app.Delete("/someDelete", deleting)
    app.Patch("/somePatch", patching)
    app.Header("/someHead", head)
    app.Options("/someOptions", options)
    
	// گوش دادن به پورت
    app.Listen(":8080")
}

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

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)
    })
    
    // برای هر درخواست متناسب، Context تعریف مسیر را نگه می‌دارد
    app.Post("/user/{name:string}/{action:path}", func(ctx iris.Context) {
        ctx.GetCurrentRoute().Tmpl().Src == "/user/{name:string}/{action:path}" // true
    })
    
    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

گروه بندی مسیردهی

گاهی نیاز است که مدیریت نسخه‌های API انجام شود یا پیشوند یکپارچه برای مسیردهی یک ماژول بزرگ تعیین شود. در اینجا، قابلیت گروه بندی مسیردهی می‌آید.

func main() {
    app := iris.Default()

    // گروه ساده: v1
    v1 := app.Party("/v1")
    {
        v1.Post("/login", loginEndpoint)
        v1.Post("/submit", submitEndpoint)
        v1.Post("/read", readEndpoint)
    }
    
    // گروه ساده: v2
    v2 := app.Party("/v2")
    {
        v2.Post("/login", loginEndpoint)
        v2.Post("/submit", submitEndpoint)
        v2.Post("/read", readEndpoint)
    }
    
    app.Listen(":8080")
}

مسیردهی MVC

فریمورک Go Iris از معماری MVC پشتیبانی می‌کند و از طریق قوانین خاصی مسیرها را به توابع کنترلرهای خاص نگاشت می‌کند.

package main

import (
	"strings"
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/middleware/logger"
	"github.com/kataras/iris/v12/middleware/recover"
	"github.com/kataras/iris/v12/mvc"
)

// ایجاد یک برنامه iris
func newApp() *iris.Application {
	app := iris.New()
	// تعیین دو میان‌افزار
	// recover برای انتقال خطاهای پنیک به منظور جلوگیری از اتمام نامطلوب برنامه استفاده می‌شود
	// logger برای ثبت درخواست‌ها استفاده می‌شود
	app.Use(recover.New())
	app.Use(logger.New())

	// ثبت کنترلر در مسیر ریشه "/"
	mvc.New(app).Handle(new(ExampleController))
	
	// همچنین می‌تواند در یک مسیر خاص ثبت شود با استفاده از گروه مسیردهی
	// مثال: ثبت کنترلر در مسیر "/books"
	// mvc.New(app.Party("/books")).Handle(new(ExampleController))
}

func main() {
	// ایجاد برنامه
	app := newApp()

	// http://localhost:8080
	// http://localhost:8080/ping
	// http://localhost:8080/hello
	// http://localhost:8080/custom_path
	app.Listen(":8080")
}

// تعریف ExampleController برای پردازش درخواست‌های "/", "/ping" و "/hello".
type ExampleController struct{}

// پردازش درخواست GET
// URL درخواست: http://localhost:8080
func (c *ExampleController) Get() mvc.Result {
	return mvc.Response{
		ContentType: "text/html",
		Text:        "<h1>خوش آمدید</h1>",
	}
}

// GetPing
// Method:   GET
// URL درخواست: http://localhost:8080/ping
func (c *ExampleController) GetPing() string {
	return "pong"
}

// GetHello
// Method:   GET
// URL درخواست: http://localhost:8080/hello
func (c *ExampleController) GetHello() interface{} {
	return map[string]string{"پیام": "سلام Iris!"}
}

// GetHelloWorld
// Method:   GET
// URL درخواست: http://localhost:8080/hello/world
func (c *ExampleController) GetHelloWorld() interface{} {
	return map[string]string{"پیام": "سلام Iris! DefaultPath"}
}

ارتباط بین مسیردهی MVC و قانون نام‌گذاری توابع کنترلر.

آدرس مسیر: گروه مسیر + نام متد HTTP + نام تابع (با حروف کوچک)

برای مثال:

func (c *ExampleController) GetPing() string {
	return "pong"
}

زیرا گروه مسیردهی تعیین نشده است، این تابع می‌تواند درخواست‌های GET برای مسیر http://localhost:8080/ping را پردازش کند.