โครงสร้างของ iris framework มี 2 โหมดสำหรับการผูก route ได้ คือ โหมด functional และ โหมด MVC โดยโหมด functional จะผูกฟังก์ชันการจัดการกับเส้นทาง URL ที่กำหนดให้กับเว็บไซต์ ในขณะที่โหมด MVC จะผูกคอนโทรลเลอร์กับเส้นทาง URL โดยที่โครงสร้างจะสร้างเส้นทาง URL ที่สอดคล้องกับกฎการตั้งชื่อของเมธอดคอนโทรลเลอร์โดยอัตโนมัติ และผูกฟังก์ชันคอนโทรลเลอร์ที่สอดคล้องกันโดยอัตโนมัติ

การผูกเส้นทางโดยใช้ Functional Route Binding

โครงสร้างการเชื่อมโยงที่ง่ายที่สุดใน iris framework ที่คุณสามารถผูกฟังก์ชันกับ URL ใด ๆ ได้

func main() {
    // สร้างแอพลิเคชัน iris พร้อม middleware ที่กำหนดไว้เริ่มต้น:
    // โดยค่าเริ่มต้น มันใช้ "debug" ระดับบันทึก
    // มันสนับสนุนการใช้งานภาษาใน "./locales" ไดเรกทอรี
    // การ์ด HTML อยู่ภายใต้ไดเรกทอรี "./views" หรือ "./templates"
    // บันทึกเข้าถึงบันทึกไว้ใน "./access.log",
    // และ middleware การกู้คืน (โดยไม่ต้องล้มละลาย) และ request ID ถูกผูกไว้แล้ว
    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)
    
	// ฟังก์ชัน Listen บนพอร์ต
    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}" // เป็นจริง
    })
    
    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

Framework 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": "สวัสดีไอริส!"}
}

// GetHelloWorld บริการ
// แบบ:   GET
// คำขอ URL: http://localhost:8080/hello/world
func (c *ExampleController) GetHelloWorld() interface{} {
	return map[string]string{"message": "สวัสดีไอริส! DefaultPath"}
}

ความสัมพันธ์ระหว่างการจัดเส้นทาง MVC และกฎตั้งชื่อของฟังก์ชันควบคุม

ที่อยู่เส้นทาง: กลุ่มเส้นทาง + ชื่อเมธอด HTTP + ชื่อฟังก์ชัน (ตัวพิมพ์เล็ก)

ตัวอย่างเช่น:

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

เนื่องจากไม่ได้ตั้งกลุ่มเส้นทาง ฟังก์ชันนี้สามารถจัดการคำขอ GET สำหรับเส้นทาง http://localhost:8080/ping ได้