Фреймворк 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.