يحتوي إطار العمل iris على نمطين لربط المسارات، الأول هو الوظيفي والآخر هو 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)
})
// بالنسبة لكل طلب مُطابق، ستحتفظ السياق بتعريف المسار
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 |
توجيه المجموعة
في بعض الأحيان، يكون هناك حاجة إلى إدارة إصدارات واجهة برمجة التطبيقات (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 يخدم
// الطريقة: GET
// URL الطلب: http://localhost:8080/ping
func (c *ExampleController) GetPing() string {
return "pong"
}
// GetHello يخدم
// الطريقة: GET
// URL الطلب: http://localhost:8080/hello
func (c *ExampleController) GetHello() interface{} {
return map[string]string{"message": "مرحبًا Iris!"}
}
// GetHelloWorld يخدم
// الطريقة: GET
// URL الطلب: http://localhost:8080/hello/world
func (c *ExampleController) GetHelloWorld() interface{} {
return map[string]string{"message": "مرحبًا Iris! DefaultPath"}
}
العلاقة بين توجيه نموذج-عرض-تحكم وقاعدة تسمية وظائف التحكم.
عنوان المسار: تجميع المسار + اسم الطريق الفرعي + اسم الدالة (بالأحرف الصغيرة)
على سبيل المثال:
func (c *ExampleController) GetPing() string {
return "pong"
}
نظرًا لعدم تحديد تجميع مسار، يمكن لهذه الدالة التعامل مع طلبات GET للمسار http://localhost:8080/ping.