Фреймворк Iris имеет два режима привязки маршрутов: функциональный и MVC. Функциональный режим привязывает обработчик к указанному URL-пути, в то время как режим MVC привязывает контроллер к URL-пути. Фреймворк автоматически генерирует соответствующие URL-пути на основе правил именования методов контроллера и автоматически привязывает соответствующие функции контроллера.

Привязка функционального маршрута

Самая простая модель маршрутизации в фреймворке Iris, где вы можете привязать функцию к любому URL.

func main() {
    // Создание приложения Iris с помощью middleware по умолчанию:
    // По умолчанию используется уровень ведения журнала "debug".
    // Поддерживается локализация, находящаяся в каталоге "./locales".
    // HTML-шаблоны находятся в каталогах "./views" или "./templates".
    // Журналы доступа сохраняются в "./access.log",
    // и восстановление (без сбоев) и идентификатор запроса уже прикреплены.
    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}" // 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 Адрес электронной почты, c проверкой домена Params().Get
:date string Формат yyyy/mm/dd, например /blog/{param:date} подходит для /blog/2022/04/21 Params().GetTime и Params().SimpleDate
:weekday uint (0-6) или string Строковый формат в виде полного названия времени.ДеньНедели ("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"}
}

Связь между MVC маршрутизацией и правилом именования функций контроллера.

Адрес маршрута: Группа маршрута + Название HTTP-метода + Название функции (в нижнем регистре)

Например:

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

Поскольку группировка маршрута не установлена, эта функция может обрабатывать GET-запросы для маршрута http://localhost:8080/ping.