فریمورک 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 را پردازش کند.