Le framework iris propose deux modes de liaison de route, l'un fonctionnel et l'autre MVC. Le mode fonctionnel lie une fonction de traitement à un chemin d'URL spécifié, tandis que le mode MVC lie un contrôleur à un chemin d'URL. Le framework génère automatiquement des chemins d'URL correspondants en fonction des règles de nommage des méthodes du contrôleur, et lie automatiquement les fonctions de contrôleur correspondantes.
Liaison de route fonctionnelle
Le modèle de routage le plus simple dans le framework iris, où vous pouvez lier une fonction à n'importe quelle URL.
func main() {
// Crée une application iris avec un middleware par défaut :
// Par défaut, il utilise le niveau de journalisation "debug".
// Il prend en charge la localisation située sous le répertoire "./locales".
// Les modèles HTML se trouvent dans les répertoires "./views" ou "./templates".
// Les journaux d'accès sont enregistrés dans "./access.log",
// et le middleware de récupération (sans crash) et l'ID de requête sont déjà attachés.
app := iris.Default()
// Lie simplement les fonctions de route en fonction de la méthode de requête HTTP et du chemin, similaire au mécanisme de routage dans Gin, echo, et d'autres 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)
// Écoute sur le port
app.Listen(":8080")
}
func main() {
app := iris.Default()
// Ce gestionnaire correspondra à /user/john mais pas à /user/ ou /user
app.Get("/user/{name}", func(ctx iris.Context) {
name := ctx.Params().Get("name")
ctx.Writef("Bonjour %s", name)
})
// Cependant, ce gestionnaire correspondra à /user/john/ et /user/john/send
// Si aucune autre route ne correspond à /user/john, il redirigera vers /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)
})
// Pour chaque requête correspondante, Context conservera la définition de la route
app.Post("/user/{name:string}/{action:path}", func(ctx iris.Context) {
ctx.GetCurrentRoute().Tmpl().Src == "/user/{name:string}/{action:path}" // true
})
app.Listen(":8080")
}
Types de paramètres intégrés disponibles :
Type de paramètre | Type Go | Condition de validation | Méthode de récupération |
---|---|---|---|
:string |
string | Tout caractère (segment de chemin unique) | Params().Get |
:uuid |
string | format uuidv4 ou v1 (segment de chemin unique) | Params().Get |
:int |
int | -9223372036854775808 à 9223372036854775807 (x64) ou -2147483648 à 2147483647 (x32), selon l'architecture de l'hôte | 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) ou 0 à 4294967295 (x32), selon l'architecture de l'hôte | 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" 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 | Lettres minuscules ou majuscules | Params().Get |
:file |
string | Lettres minuscules ou majuscules, chiffres, trait de soulignement (_), tiret (-), point (.), ne peut pas contenir d'espaces ou d'autres caractères spéciaux invalides pour les noms de fichiers | Params().Get |
:path |
string | Tout caractère, peut être séparé par des barres obliques (segment de chemin), mais devrait être la dernière partie du chemin de la route | Params().Get |
:mail |
string | Adresse e-mail, domaine non validé | Params().Get |
:email |
string | Adresse e-mail, domaine validé | Params().Get |
:date |
string | Format yyyy/mm/dd, par exemple /blog/{param:date} correspond à /blog/2022/04/21 | Params().GetTime et Params().SimpleDate |
:weekday |
uint (0-6) ou string | Format de chaîne comme le nom complet de time.Weekday ("dimanche" à "lundi" ou "Sunday" à "Monday"), par exemple /schedule/{param:weekday} correspond à /schedule/lundi | Params().GetWeekday |
Routage de groupe
Parfois, la gestion de la version de l'API est nécessaire, ou un préfixe unifié est défini pour le routage d'un grand module. C'est là que la capacité de routage de groupe entre en jeu.
func main() {
app := iris.Default()
// Groupe simple : v1
v1 := app.Party("/v1")
{
v1.Post("/login", loginEndpoint)
v1.Post("/submit", submitEndpoint)
v1.Post("/read", readEndpoint)
}
// Groupe simple : v2
v2 := app.Party("/v2")
{
v2.Post("/login", loginEndpoint)
v2.Post("/submit", submitEndpoint)
v2.Post("/read", readEndpoint)
}
app.Listen(":8080")
}
Routage MVC
Le framework Go Iris prend en charge l'architecture MVC, en cartographiant les routes vers des fonctions de contrôleur spécifiques selon certaines règles.
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"
)
// Créer une application iris
func newApp() *iris.Application {
app := iris.New()
// Définir deux middleware
// recover est utilisé pour intercepter les erreurs de panique et éviter une terminaison anormale du programme
// logger est utilisé pour enregistrer les requêtes
app.Use(recover.New())
app.Use(logger.New())
// Enregistrer le contrôleur sur la route racine "/"
mvc.New(app).Handle(new(ExampleController))
// Il peut également être enregistré sur un chemin spécifique à l'aide d'un regroupement de routes
// Exemple : Enregistrer le contrôleur sous le chemin "/livres"
// mvc.New(app.Party("/livres")).Handle(new(ExampleController))
}
func main() {
// Créer l'application
app := newApp()
// http://localhost:8080
// http://localhost:8080/ping
// http://localhost:8080/hello
// http://localhost:8080/chemin_personnalisé
app.Listen(":8080")
}
// Définir ExampleController pour gérer les requêtes pour "/", "/ping" et "/hello".
type ExampleController struct{}
// Gérer la demande GET
// URL de la requête : http://localhost:8080
func (c *ExampleController) Get() mvc.Result {
return mvc.Response{
ContentType: "text/html",
Text: "<h1>Bienvenue</h1>",
}
}
// GetPing retourne
// Méthode : GET
// URL de la requête : http://localhost:8080/ping
func (c *ExampleController) GetPing() string {
return "pong"
}
// GetHello sert
// Méthode : GET
// URL de la requête : http://localhost:8080/hello
func (c *ExampleController) GetHello() interface{} {
return map[string]string{"message": "Bonjour Iris!"}
}
// GetHelloWorld sert
// Méthode : GET
// URL de la requête : http://localhost:8080/hello/world
func (c *ExampleController) GetHelloWorld() interface{} {
return map[string]string{"message": "Bonjour Iris! CheminParDéfaut"}
}
Relation entre le routage MVC et la règle de nommage des fonctions de contrôleur.
Adresse de la route : Regroupement de routes + Nom de la méthode HTTP + Nom de la fonction (en minuscules)
Par exemple :
func (c *ExampleController) GetPing() string {
return "pong"
}
Comme aucun regroupement de routes n'est défini, cette fonction peut gérer les demandes GET pour la route http://localhost:8080/ping.