El framework iris tiene dos modos para la vinculación de rutas, uno es funcional y el otro es MVC. El modo funcional vincula una función de manejo a una ruta URL especificada, mientras que el modo MVC vincula un controlador a una ruta URL. El framework genera automáticamente rutas URL correspondientes basadas en las reglas de nombrado de los métodos del controlador, y vincula automáticamente las funciones del controlador correspondientes.
Vinculación de Ruta Funcional
El modelo de enrutamiento más simple en el framework iris, donde puedes vincular una función a cualquier URL.
func main() {
// Crea una aplicación iris con middleware predeterminado:
// De forma predeterminada, utiliza el nivel de registro "debug".
// Admite la localización ubicada en el directorio "./locales".
// Las plantillas HTML se encuentran en los directorios "./views" o "./templates".
// Los registros de acceso se guardan en "./access.log",
// y la recuperación (sin fallos) y el middleware de identificación de solicitud ya están adjuntos.
app := iris.Default()
// Simplemente vincula funciones de ruta según el método de solicitud HTTP y la ruta, similar al mecanismo de enrutamiento en Gin, echo y otros frameworks.
app.Get("/someGet", obteniendo)
app.Post("/somePost", enviando)
app.Put("/somePut", poniendo)
app.Delete("/someDelete", eliminando)
app.Patch("/somePatch", parchando)
app.Header("/someHead", cabecera)
app.Options("/someOptions", opciones)
// Escucha en el puerto
app.Listen(":8080")
}
func main() {
app := iris.Default()
// Este controlador coincidirá con /user/john pero no con /user/ o /user
app.Get("/user/{name}", func(ctx iris.Context) {
name := ctx.Params().Get("name")
ctx.Writef("Hola %s", name)
})
// Sin embargo, este controlador coincidirá con /user/john/ y /user/john/send
// Si ninguna otra ruta coincide con /user/john, redireccionará a /user/john/
app.Get("/user/{name}/{action:path}", func(ctx iris.Context) {
name := ctx.Params().Get("name")
action := ctx.Params().Get("action")
mensaje := name + " es " + action
ctx.WriteString(mensaje)
})
// Para cada solicitud coincidente, el Contexto mantendrá la definición de ruta
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 integrados disponibles:
Tipo de Parámetro | Tipo en Go | Condición de Validación | Método de Recuperación |
---|---|---|---|
:string |
string | Cualquier carácter (segmento de ruta único) | Params().Get |
:uuid |
string | Formato uuidv4 o v1 (segmento de ruta único) | Params().Get |
:int |
int | -9223372036854775808 a 9223372036854775807 (x64) o -2147483648 a 2147483647 (x32), dependiendo de la arquitectura del 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) o 0 a 4294967295 (x32), dependiendo de la arquitectura del 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" o "t" o "T" o "TRUE" o "true" o "True" o "0" o "f" o "F" o "FALSE" o "false" o "False" | Params().GetBool |
:alphabetical |
string | Letras minúsculas o mayúsculas | Params().Get |
:file |
string | Letras minúsculas o mayúsculas, números, guion bajo (_), guion (-), punto (.), no puede contener espacios u otros caracteres especiales inválidos para nombres de archivo | Params().Get |
:path |
string | Cualquier carácter, puede estar separado por barra (segmento de ruta), pero debe ser la última parte de la ruta de la ruta | Params().Get |
:mail |
string | Dirección de correo electrónico, dominio no validado | Params().Get |
:email |
string | Dirección de correo electrónico, dominio validado | Params().Get |
:date |
string | Formato yyyy/mm/dd, por ejemplo, /blog/{param:date} coincide con /blog/2022/04/21 | Params().GetTime y Params().SimpleDate |
:weekday |
uint (0-6) o string | Formato de cadena como el nombre largo de time.Weekday ("domingo" a "lunes" o "Domingo" a "Lunes"), por ejemplo, /schedule/{param:weekday} coincide con /schedule/lunes | Params().GetWeekday |
Enrutamiento de grupo
A veces, es necesario gestionar la versión de la API o establecer un prefijo unificado para el enrutamiento de un módulo grande. Aquí es donde entra en juego la capacidad de enrutamiento de grupo.
func main() {
app := iris.Default()
// Grupo simple: v1
v1 := app.Party("/v1")
{
v1.Post("/login", loginEndpoint)
v1.Post("/submit", submitEndpoint)
v1.Post("/read", readEndpoint)
}
// Grupo simple: v2
v2 := app.Party("/v2")
{
v2.Post("/login", loginEndpoint)
v2.Post("/submit", submitEndpoint)
v2.Post("/read", readEndpoint)
}
app.Listen(":8080")
}
Enrutamiento MVC
El marco Go Iris admite la arquitectura MVC, mapeando rutas a funciones de controlador específicas a través de ciertas reglas.
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"
)
// Crear una aplicación Iris
func newApp() *iris.Application {
app := iris.New()
// Configurar dos middleware
// recover se utiliza para interceptar errores de pánico y evitar la terminación anormal del programa
// logger se utiliza para registrar las solicitudes
app.Use(recover.New())
app.Use(logger.New())
// Registrar el controlador en la ruta raíz "/" aquí.
mvc.New(app).Handle(new(ExampleController))
// También se puede registrar en una ruta específica con la ayuda de la agrupación de rutas
// Ejemplo: Registrar el controlador en la ruta /books
// mvc.New(app.Party("/books")).Handle(new(ExampleController))
}
func main() {
// Crear la aplicación
app := newApp()
// http://localhost:8080
// http://localhost:8080/ping
// http://localhost:8080/hello
// http://localhost:8080/custom_path
app.Listen(":8080")
}
// Definir ExampleController para manejar las solicitudes para "/", "/ping" y "/hello".
type ExampleController struct{}
// Manejar la solicitud GET
// URL de la solicitud: http://localhost:8080
func (c *ExampleController) Get() mvc.Result {
return mvc.Response{
ContentType: "text/html",
Text: "<h1>Bienvenido</h1>",
}
}
// GetPing devuelve
// Método: GET
// URL de la solicitud: http://localhost:8080/ping
func (c *ExampleController) GetPing() string {
return "pong"
}
// GetHello devuelve
// Método: GET
// URL de la solicitud: http://localhost:8080/hello
func (c *ExampleController) GetHello() interface{} {
return map[string]string{"mensaje": "¡Hola Iris!"}
}
// GetHelloWorld devuelve
// Método: GET
// URL de la solicitud: http://localhost:8080/hello/world
func (c *ExampleController) GetHelloWorld() interface{} {
return map[string]string{"mensaje": "¡Hola Iris! Ruta predeterminada"}
}
Relación entre el enrutamiento MVC y la regla de nombrado de las funciones de controlador.
Dirección de la ruta: Grupo de rutas + nombre del método HTTP + nombre de la función (en minúsculas)
Por ejemplo:
func (c *ExampleController) GetPing() string {
return "pong"
Como no se establece ningún grupo de rutas, esta función puede manejar las solicitudes GET para la ruta http://localhost:8080/ping.