O framework iris tem dois modos para vinculação de rotas, um é funcional e o outro é o MVC. O modo funcional vincula uma função de manipulação a um caminho de URL especificado, enquanto o modo MVC vincula um controlador a um caminho de URL. O framework gera automaticamente os caminhos de URL correspondentes com base nas regras de nomeação dos métodos do controlador e vincula automaticamente as funções do controlador correspondentes.
Vinculação de Rota Funcional
O modelo de roteamento mais simples no framework iris, onde você pode vincular uma função a qualquer URL.
func main() {
// Crie uma aplicação iris com middleware padrão:
// Por padrão, ele usa o nível de log "debug".
// Ele suporta localização localizada no diretório "./locales".
// Os modelos HTML estão localizados nos diretórios "./views" ou "./templates".
// Logs de acesso são salvos em "./access.log",
// e a recuperação (sem travamento) e o middleware de ID de solicitação já estão anexados.
app := iris.Default()
// Simplesmente vincule funções de rota com base no método de solicitação HTTP e caminho, semelhante ao mecanismo de roteamento em Gin, echo e outros frameworks.
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)
// Escute na porta
app.Listen(":8080")
}
func main() {
app := iris.Default()
// Este manipulador irá corresponder a /user/john mas não a /user/ ou /user
app.Get("/user/{name}", func(ctx iris.Context) {
name := ctx.Params().Get("name")
ctx.Writef("Olá %s", name)
})
// No entanto, este manipulador irá corresponder a /user/john/ e /user/john/send
// Se nenhuma outra rota corresponder a /user/john, redirecionará para /user/john/
app.Get("/user/{name}/{action:path}", func(ctx iris.Context) {
name := ctx.Params().Get("name")
action := ctx.Params().Get("action")
message := name + " está " + action
ctx.WriteString(message)
})
// Para cada requisição correspondida, o Context manterá a definição da rota
app.Post("/user/{name:string}/{action:path}", func(ctx iris.Context) {
ctx.GetCurrentRoute().Tmpl().Src == "/user/{name:string}/{action:path}" // true
})
app.Listen(":8080")
}
Tipos de parâmetros embutidos disponíveis:
Tipo de Parâmetro | Tipo Go | Condição de Validação | Método de Recuperação |
---|---|---|---|
:string |
string | Qualquer caractere (único segmento do caminho) | Params().Get |
:uuid |
string | Formato uuidv4 ou v1 (único segmento do caminho) | Params().Get |
:int |
int | -9223372036854775808 a 9223372036854775807 (x64) ou -2147483648 a 2147483647 (x32), dependendo da arquitetura do host | Params().GetInt |
:int8 |
int8 | -128 a 127 | Params().GetInt8 |
:int16 |
int16 | -32768 a 32767 | Params().GetInt16 |
:int32 |
int32 | -2147483648 a 2147483647 | Params().GetInt32 |
:int64 |
int64 | -9223372036854775808 a 9223372036854775807 | Params().GetInt64 |
:uint |
uint | 0 a 18446744073709551615 (x64) ou 0 a 4294967295 (x32), dependendo da arquitetura do host | Params().GetUint |
:uint8 |
uint8 | 0 a 255 | Params().GetUint8 |
:uint16 |
uint16 | 0 a 65535 | Params().GetUint16 |
:uint32 |
uint32 | 0 a 4294967295 | Params().GetUint32 |
:uint64 |
uint64 | 0 a 18446744073709551615 | Params().GetUint64 |
:bool |
bool | "1" ou "t" ou "T" ou "TRUE" ou "true" ou "True" ou "0" ou "f" ou "F" ou "FALSE" ou "false" ou "False" | Params().GetBool |
:alphabetical |
string | Letras minúsculas ou maiúsculas | Params().Get |
:file |
string | Letras minúsculas ou maiúsculas, números, sublinhado (_), hífen (-), ponto (.), não pode conter espaços ou outros caracteres especiais inválidos para nomes de arquivos | Params().Get |
:path |
string | Qualquer caractere, pode ser separado por barra (segmento do caminho), mas deve ser a última parte do caminho da rota | Params().Get |
:mail |
string | Endereço de e-mail, domínio não validado | Params().Get |
:email |
string | Endereço de e-mail, domínio validado | Params().Get |
:date |
string | Formato yyyy/mm/dd, por exemplo /blog/{param:date} corresponde a /blog/2022/04/21 | Params().GetTime e Params().SimpleDate |
:weekday |
uint (0-6) ou string | Formato de string como o nome completo do time.Weekday ("sunday" a "monday" ou "Sunday" a "Monday"), por exemplo /schedule/{param:weekday} corresponde a /schedule/monday | Params().GetWeekday |
Group Routing
Às vezes, é necessário o gerenciamento de versão da API, ou um prefixo unificado é definido para o roteamento de um grande módulo. É aqui que entra a capacidade do roteamento de grupo.
func main() {
app := iris.Default()
// Grupo simples: v1
v1 := app.Party("/v1")
{
v1.Post("/login", loginEndpoint)
v1.Post("/submit", submitEndpoint)
v1.Post("/read", readEndpoint)
}
// Grupo simples: v2
v2 := app.Party("/v2")
{
v2.Post("/login", loginEndpoint)
v2.Post("/submit", submitEndpoint)
v2.Post("/read", readEndpoint)
}
app.Listen(":8080")
}
Roteamento MVC
O framework Go Iris suporta a arquitetura MVC, mapeando rotas para funções de controle específicas através de regras específicas.
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"
)
// Cria uma aplicação iris
func newApp() *iris.Application {
app := iris.New()
// Configura dois middlewares
// recover é usado para interceptar erros de pânico e evitar a terminação anormal do programa
// logger é usado para registrar pedidos
app.Use(recover.New())
app.Use(logger.New())
// Registra o controlador na rota raiz "/"
mvc.New(app).Handle(new(ExampleController))
// Também pode ser registrado em um caminho específico com a ajuda do agrupamento de rotas
// Exemplo: Registra o controlador no caminho /livro
// mvc.New(app.Party("/livro")).Handle(new(ExampleController))
}
func main() {
// Cria a aplicação
app := newApp()
// http://localhost:8080
// http://localhost:8080/ping
// http://localhost:8080/hello
// http://localhost:8080/caminho_customizado
app.Listen(":8080")
}
// Define o ExampleController para lidar com pedidos para "/", "/ping" e "/hello".
type ExampleController struct{}
// Lida com o pedido GET
// URL do pedido: http://localhost:8080
func (c *ExampleController) Get() mvc.Result {
return mvc.Response{
ContentType: "text/html",
Text: "<h1>Bem-vindo</h1>",
}
}
// GetPing serve
// Método: GET
// URL do pedido: http://localhost:8080/ping
func (c *ExampleController) GetPing() string {
return "pong"
}
// GetHello serve
// Método: GET
// URL do pedido: http://localhost:8080/hello
func (c *ExampleController) GetHello() interface{} {
return map[string]string{"message": "Olá Iris!"}
}
// GetHelloWorld serve
// Método: GET
// URL do pedido: http://localhost:8080/hello/mundo
func (c *ExampleController) GetHelloWorld() interface{} {
return map[string]string{"message": "Olá Iris! DefaultPath"}
}
Relação entre o roteamento MVC e a regra de nomeação das funções do controlador.
Endereço da Rota: Grupo de Rotas + Nome do Método HTTP + Nome da Função (minúsculo)
Por exemplo:
func (c *ExampleController) GetPing() string {
return "pong"
Como nenhum agrupamento de rota foi definido, esta função pode lidar com pedidos GET para a rota http://localhost:8080/ping.