Khung (framework) iris có hai chế độ để buộc đường dẫn (route binding), một là chức năng (functional) và một là MVC. Chế độ chức năng liên kết một chức năng xử lý với một đường dẫn URL cụ thể, trong khi chế độ MVC liên kết một điều khiển (controller) với một đường dẫn URL. Khung (framework) tự động tạo ra các đường dẫn URL tương ứng dựa trên quy tắc đặt tên các phương thức điều khiển, và tự động buộc các chức năng điều khiển tương ứng.

Buộc Đường Dẫn Chức Năng

Mô hình định tuyến đơn giản nhất trong khung (framework) iris, nơi bạn có thể buộc một chức năng với bất kỳ URL nào.

func main() {
    // Tạo một ứng dụng iris với middleware mặc định:
    // Theo mặc định, nó sử dụng cấp độ ghi log "debug".
    // Nó hỗ trợ bản địa hóa nằm dưới thư mục "./locales".
    // Các mẫu HTML nằm dưới thư mục "./views" hoặc "./templates".
    // Nhật ký truy cập được lưu trong "./access.log",
    // và middleware khôi phục (không gây sự cố) và ID yêu cầu đã được gắn kết.
    app := iris.Default()

	// Đơn giản buộc các chức năng đường dẫn dựa trên phương thức yêu cầu HTTP và đường dẫn, tương tự cơ chế định tuyến trong Gin, echo và các framework khác.
    app.Get("/someGet", lấy)
    app.Post("/somePost", đăng)
    app.Put("/somePut", đặt)
    app.Delete("/someDelete", xóa)
    app.Patch("/somePatch", sửa)
    app.Header("/someHead", đầu)
    app.Options("/someOptions", tùy_chọn)
    
	// Nghe trên cổng
    app.Listen(":8080")
}

Tham số trong Đường dẫn

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

    // Đoạn xử lý này sẽ phù hợp với /user/john nhưng không phù hợp với /user/ hoặc /user
    app.Get("/user/{name}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        ctx.Writef("Xin chào %s", name)
    })
    
    // Tuy nhiên, đoạn xử lý này sẽ phù hợp với /user/john/ và /user/john/send
    // Nếu không có route nào phù hợp với /user/john, nó sẽ chuyển hướng đến /user/john/
    app.Get("/user/{name}/{action:path}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        action := ctx.Params().Get("action")
        message := name + " là " + action
        ctx.WriteString(message)
    })
    
    // Đối với mỗi yêu cầu phù hợp, Context sẽ giữ định nghĩa route
    app.Post("/user/{name:string}/{action:path}", func(ctx iris.Context) {
        ctx.GetCurrentRoute().Tmpl().Src == "/user/{name:string}/{action:path}" // true
    })
    
    app.Listen(":8080")
}

Các loại tham số tích hợp có sẵn:

Loại Tham số Kiểu Go Điều kiện Đánh giá Phương thức Truy xuất
:string string Bất kỳ ký tự nào (một đoạn đường dẫn duy nhất) Params().Get
:uuid string Định dạng uuidv4 hoặc v1 (một đoạn đường dẫn duy nhất) Params().Get
:int int -9223372036854775808 đến 9223372036854775807 (x64) hoặc -2147483648 đến 2147483647 (x32), tùy thuộc vào kiến trúc máy chủ Params().GetInt
:int8 int8 -128 đến 127 Params().GetInt8
:int16 int16 -32768 đến 32767 Params().GetInt16
:int32 int32 -2147483648 đến 2147483647 Params().GetInt32
:int64 int64 -9223372036854775808 đến 9223372036854775807 Params().GetInt64
:uint uint 0 đến 18446744073709551615 (x64) hoặc 0 đến 4294967295 (x32), tùy thuộc vào kiến trúc máy chủ Params().GetUint
:uint8 uint8 0 đến 255 Params().GetUint8
:uint16 uint16 0 đến 65535 Params().GetUint16
:uint32 uint32 0 đến 4294967295 Params().GetUint32
:uint64 uint64 0 đến 18446744073709551615 Params().GetUint64
:bool bool "1" hoặc "t" hoặc "T" hoặc "TRUE" hoặc "true" hoặc "True" hoặc "0" hoặc "f" hoặc "F" hoặc "FALSE" hoặc "false" hoặc "False" Params().GetBool
:alphabetical string Chữ thường hoặc chữ in hoa Params().Get
:file string Chữ thường hoặc chữ in hoa, số, gạch dưới (_), dấu gạch ngang (-), dấu chấm (.), không chứa khoảng trắng hoặc các ký tự đặc biệt không hợp lệ khác cho tên tệp Params().Get
:path string Bất kỳ ký tự nào, có thể được tách bằng dấu gạch chéo (đoạn đường dẫn), nhưng nên là phần cuối cùng của đường dẫn route Params().Get
:mail string Địa chỉ Email, tên miền không được xác nhận Params().Get
:email string Địa chỉ Email, tên miền được xác nhận Params().Get
:date string Định dạng yyyy/mm/dd, ví dụ /blog/{param:date} phù hợp với /blog/2022/04/21 Params().GetTimeParams().SimpleDate
:weekday uint (0-6) hoặc string Định dạng chuỗi như tên dài của time.Weekday ("sunday" đến "monday" hoặc "Sunday" đến "Monday"), ví dụ /schedule/{param:weekday} phù hợp với /schedule/monday Params().GetWeekday

Nhóm định tuyến

Đôi khi, quản lý phiên bản API là cần thiết, hoặc một tiền tố thống nhất được đặt cho việc định tuyến của một module lớn. Đây là nơi mà khả năng định tuyến nhóm được áp dụng.

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

    // Nhóm đơn giản: v1
    v1 := app.Party("/v1")
    {
        v1.Post("/login", loginEndpoint)
        v1.Post("/submit", submitEndpoint)
        v1.Post("/read", readEndpoint)
    }
    
    // Nhóm đơn giản: v2
    v2 := app.Party("/v2")
    {
        v2.Post("/login", loginEndpoint)
        v2.Post("/submit", submitEndpoint)
        v2.Post("/read", readEndpoint)
    }
    
    app.Listen(":8080")
}

Định tuyến MVC

Framework Go Iris hỗ trợ kiến trúc MVC, ánh xạ các đường dẫn đến các hàm điều khiển cụ thể thông qua một số quy tắc cụ thể.

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"
)

// Tạo một ứng dụng iris mới
func newApp() *iris.Application {
	app := iris.New()
	// Thiết lập hai middleware
	// recover được sử dụng để chặn lỗi panic để tránh việc kết thúc chương trình bất thường
	// logger được sử dụng để ghi nhật ký yêu cầu
	app.Use(recover.New())
	app.Use(logger.New())

	// Đăng ký điều khiển vào đường dẫn gốc "/"
	mvc.New(app).Handle(new(ExampleController))
	
	// Nó cũng có thể được đăng ký vào một đường dẫn cụ thể với sự trợ giúp của nhóm định tuyến
	// Ví dụ: Đăng ký điều khiển dưới đường dẫn "/books"
	// mvc.New(app.Party("/books")).Handle(new(ExampleController))
}

func main() {
	// Tạo ứng dụng
	app := newApp()

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

// Xác định ExampleController để xử lý yêu cầu cho "/", "/ping", và "/hello".
type ExampleController struct{}

// Xử lý yêu cầu GET
// URL yêu cầu: http://localhost:8080
func (c *ExampleController) Get() mvc.Result {
	return mvc.Response{
		ContentType: "text/html",
		Text:        "<h1>Welcome</h1>",
	}
}

// GetPing phục vụ
// Phương thức:   GET
// URL yêu cầu: http://localhost:8080/ping
func (c *ExampleController) GetPing() string {
	return "pong"
}

// GetHello phục vụ
// Phương thức:   GET
// URL yêu cầu: http://localhost:8080/hello
func (c *ExampleController) GetHello() interface{} {
	return map[string]string{"message": "Xin chào Iris!"}
}

// GetHelloWorld phục vụ
// Phương thức:   GET
// URL yêu cầu: http://localhost:8080/hello/world
func (c *ExampleController) GetHelloWorld() interface{} {
	return map[string]string{"message": "Xin chào Iris! DefaultPath"}
}

Mối quan hệ giữa định tuyến MVC và quy tắc đặt tên của các hàm điều khiển.

Địa chỉ Đường dẫn: Nhóm Định tuyến + Tên phương thức HTTP + Tên hàm (viết thường)

Ví dụ:

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

Do không có nhóm định tuyến nào được thiết lập, hàm này có thể xử lý yêu cầu GET cho đường dẫn http://localhost:8080/ping.