Kerangka kerja iris memiliki dua mode untuk pengikatan rute, yaitu fungsional dan MVC. Mode fungsional mengikat fungsi penanganan ke jalur URL yang ditentukan, sementara mode MVC mengikat pengontrol ke jalur URL. Kerangka kerja secara otomatis menghasilkan jalur URL yang sesuai berdasarkan aturan penamaan metode pengontrol, dan secara otomatis mengikat fungsi pengontrol yang sesuai.

Pengikatan Rute Fungsional

Model routing paling sederhana dalam kerangka kerja iris, di mana Anda dapat mengikat fungsi ke URL apa pun.

func main() {
    // Buat aplikasi iris dengan middleware default:
    // Secara default, itu menggunakan tingkat log "debug".
    // Mendukung lokalitas yang terletak di bawah direktori "./locales".
    // Templat HTML terletak di bawah direktori "./views" atau "./templates".
    // Log akses disimpan di "./access.log",
    // dan pemulihan (tanpa crash) serta middleware ID permintaan sudah dilampirkan.
    app := iris.Default()

	// Hanya mengikat fungsi rute berdasarkan metode permintaan HTTP dan jalur, mirip dengan mekanisme routing di Gin, echo, dan kerangka kerja lainnya.
    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)
    
	// Mendengarkan port
    app.Listen(":8080")
}

Parameter di Path

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

    // Handler ini akan cocok dengan /user/john tetapi tidak dengan /user/ atau /user
    app.Get("/user/{name}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        ctx.Writef("Halo %s", name)
    })
    
    // Namun, handler ini akan cocok dengan /user/john/ dan /user/john/send
    // Jika tidak ada rute lain yang cocok dengan /user/john, maka akan diarahkan ke /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)
    })
    
    // Untuk setiap permintaan yang cocok, Konteks akan menyimpan definisi rute
    app.Post("/user/{name:string}/{action:path}", func(ctx iris.Context) {
        ctx.GetCurrentRoute().Tmpl().Src == "/user/{name:string}/{action:path}" // true
    })
    
    app.Listen(":8080")
}

Tersedia jenis parameter bawaan:

Jenis Parameter Tipe Go Kondisi Validasi Metode Pengambilan
:string string Semua karakter (segmen path tunggal) Params().Get
:uuid string Format uuidv4 atau v1 (segmen path tunggal) Params().Get
:int int -9223372036854775808 hingga 9223372036854775807 (x64) atau -2147483648 hingga 2147483647 (x32), tergantung pada arsitektur host Params().GetInt
:int8 int8 -128 hingga 127 Params().GetInt8
:int16 int16 -32768 hingga 32767 Params().GetInt16
:int32 int32 -2147483648 hingga 2147483647 Params().GetInt32
:int64 int64 -9223372036854775808 hingga 9223372036854775807 Params().GetInt64
:uint uint 0 hingga 18446744073709551615 (x64) atau 0 hingga 4294967295 (x32), tergantung pada arsitektur host Params().GetUint
:uint8 uint8 0 hingga 255 Params().GetUint8
:uint16 uint16 0 hingga 65535 Params().GetUint16
:uint32 uint32 0 hingga 4294967295 Params().GetUint32
:uint64 uint64 0 hingga 18446744073709551615 Params().GetUint64
:bool bool "1" atau "t" atau "T" atau "TRUE" atau "true" atau "True" atau "0" atau "f" atau "F" atau "FALSE" atau "false" atau "False" Params().GetBool
:alphabetical string Huruf kecil atau huruf besar Params().Get
:file string Huruf kecil atau huruf besar, angka, garis bawah (_), tanda hubung (-), titik (.), tidak boleh mengandung spasi atau karakter khusus invalid lainnya untuk nama file Params().Get
:path string Semua karakter, dapat dipisahkan oleh slash (segmen path), tetapi harus menjadi bagian terakhir dari rute path Params().Get
:mail string Alamat email, domain tidak divalidasi Params().Get
:email string Alamat email, domain divalidasi Params().Get
:date string Format yyyy/mm/dd, misalnya /blog/{param:date} cocok dengan /blog/2022/04/21 Params().GetTime dan Params().SimpleDate
:weekday uint (0-6) or string Format string sebagai nama panjang time.Weekday ("sunday" hingga "monday" atau "Sunday" hingga "Monday"), misalnya /schedule/{param:weekday} cocok dengan /schedule/monday Params().GetWeekday

Routing Grup

Terkadang, manajemen versi API diperlukan, atau awalan yang seragam diatur untuk routing modul besar. Di sinilah kemampuan routing grup muncul.

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

    // Grup sederhana: v1
    v1 := app.Party("/v1")
    {
        v1.Post("/login", loginEndpoint)
        v1.Post("/submit", submitEndpoint)
        v1.Post("/read", readEndpoint)
    }
    
    // Grup sederhana: v2
    v2 := app.Party("/v2")
    {
        v2.Post("/login", loginEndpoint)
        v2.Post("/submit", submitEndpoint)
        v2.Post("/read", readEndpoint)
    }
    
    app.Listen(":8080")
}

Routing MVC

Framework Go Iris mendukung arsitektur MVC, memetakan rute ke fungsi pengontrol tertentu melalui aturan tertentu.

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

// Buat aplikasi iris
func newApp() *iris.Application {
	app := iris.New()
	// Atur dua middleware
	// recover digunakan untuk mengintersep kesalahan panic untuk menghindari terminasi program yang abnormal
	// logger digunakan untuk mencatat permintaan
	app.Use(recover.New())
	app.Use(logger.New())

	// Daftarkan pengontrol ke rute "/root" di sini.
	mvc.New(app).Handle(new(ExampleController))
	
	// Ini juga dapat didaftarkan ke jalur tertentu dengan bantuan pengelompokan rute
	// Contoh: Daftarkan pengontrol di bawah jalur /books
	// mvc.New(app.Party("/books")).Handle(new(ExampleController))
}

func main() {
	// Buat aplikasinya
	app := newApp()

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

// Tentukan ExampleController untuk menangani permintaan untuk "/", "/ping" dan "/hello".
type ExampleController struct{}

// Handle permintaan GET
// URL Permintaan: http://localhost:8080
func (c *ExampleController) Get() mvc.Result {
	return mvc.Response{
		ContentType: "text/html",
		Text:        "<h1>Welcome</h1>",
	}
}

// GetPing melayani
// Metode:   GET
// URL Permintaan: http://localhost:8080/ping
func (c *ExampleController) GetPing() string {
	return "pong"
}

// GetHello melayani
// Metode:   GET
// URL Permintaan: http://localhost:8080/hello
func (c *ExampleController) GetHello() interface{} {
	return map[string]string{"message": "Hello Iris!"}
}

// GetHelloWorld melayani
// Metode:   GET
// URL Permintaan: http://localhost:8080/hello/world
func (c *ExampleController) GetHelloWorld() interface{} {
	return map[string]string{"message": "Hello Iris! DefaultPath"}
}

Hubungan antara routing MVC dan aturan penamaan fungsi pengontrol.

Alamat Rute: Grup Rute + nama metode HTTP + nama fungsi (huruf kecil)

Sebagai contoh:

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

Karena tidak ada pengelompokan rute yang diatur, fungsi ini dapat menangani permintaan GET untuk rute http://localhost:8080/ping.