Il framework iris ha due modalità per il binding delle route, una è funzionale e l'altra è MVC. La modalità funzionale collega una funzione di gestione a un percorso URL specificato, mentre la modalità MVC collega un controller a un percorso URL. Il framework genera automaticamente percorsi URL corrispondenti in base alle regole di denominazione dei metodi del controller e collega automaticamente le funzioni del controller corrispondenti.
Binding della Route Funzionale
Il modello di routing più semplice nel framework iris, in cui è possibile collegare una funzione a qualsiasi URL.
func main() {
// Crea un'applicazione iris con middleware predefiniti:
// Per impostazione predefinita, utilizza il livello di registro "debug".
// Supporta la localizzazione situata sotto la directory "./locales".
// I modelli HTML sono situati sotto le directory "./views" o "./templates".
// I log degli accessi vengono salvati in "./access.log",
// e il middleware di recovery (senza crash) e ID della richiesta sono già allegati.
app := iris.Default()
// Collega semplicemente le funzioni della route in base al metodo di richiesta HTTP e al percorso, simile al meccanismo di routing in Gin, echo e altri framework.
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)
// Ascolta sulla porta
app.Listen(":8080")
}
package main
import "github.com/kataras/iris/v12"
func main() {
app := iris.Default()
// Questo gestore corrisponderà a /user/john ma non a /user/ o /user
app.Get("/user/{name}", func(ctx iris.Context) {
name := ctx.Params().Get("name")
ctx.Writef("Ciao %s", name)
})
// Tuttavia, questo gestore corrisponderà a /user/john/ e /user/john/send
// Se nessun'altra route corrisponde a /user/john, verrà reindirizzato a /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)
})
// Per ogni richiesta corrispondente, Context conserverà la definizione della 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")
}
Tipi di parametri incorporati disponibili:
Tipo di parametro | Tipo Go | Condizione di convalida | Metodo di recupero |
---|---|---|---|
:string |
stringa | Qualsiasi carattere (singolo segmento di percorso) | Params().Get |
:uuid |
stringa | Formato uuidv4 o v1 (singolo segmento di percorso) | Params().Get |
:int |
int | -9223372036854775808 a 9223372036854775807 (x64) o -2147483648 a 2147483647 (x32), a seconda dell'architettura dell'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), a seconda dell'architettura dell'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 |
:alfabetico |
stringa | Lettere maiuscole o minuscole | Params().Get |
:file |
stringa | Lettere maiuscole o minuscole, numeri, trattino basso (_), trattino (-), punto (.), non può contenere spazi o altri caratteri speciali non validi per i nomi file | Params().Get |
:path |
stringa | Qualsiasi carattere, può essere separato da barra (segmento di percorso), ma dovrebbe essere l'ultima parte del percorso della route | Params().Get |
:mail |
stringa | Indirizzo email, dominio non convalidato | Params().Get |
:email |
stringa | Indirizzo email, dominio convalidato | Params().Get |
:data |
stringa | Formato yyyy/mm/gg, ad esempio /blog/{param:data} corrisponde a /blog/2022/04/21 | Params().GetTime e Params().SimpleDate |
:giornoSettimana |
uint (0-6) o stringa | Formato stringa come il nome esteso di time.Weekday ("domenica" a "lunedì" o "Sunday" a "Monday"), ad esempio /schedule/{param:giornoSettimana} corrisponde a /schedule/lunedì | Params().GetWeekday |
## Gruppo di Routing
A volte è necessaria la gestione della versione dell'API, oppure viene impostato un prefisso unificato per il routing di un ampio modulo. Qui entra in gioco la capacità di creare gruppi di routing.
```go
func main() {
app := iris.Default()
// Gruppo semplice: v1
v1 := app.Party("/v1")
{
v1.Post("/login", loginEndpoint)
v1.Post("/submit", submitEndpoint)
v1.Post("/read", readEndpoint)
}
// Gruppo semplice: v2
v2 := app.Party("/v2")
{
v2.Post("/login", loginEndpoint)
v2.Post("/submit", submitEndpoint)
v2.Post("/read", readEndpoint)
}
app.Listen(":8080")
}
Routing MVC
Il framework Go Iris supporta l'architettura MVC, mappando le route a specifiche funzioni del controller attraverso determinate regole.
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"
)
// Crea un'applicazione iris
func newApp() *iris.Application {
app := iris.New()
// Imposta due middleware
// recover è utilizzato per intercettare gli errori di panico per evitare la terminazione anomala del programma
// logger è utilizzato per registrare le richieste
app.Use(recover.New())
app.Use(logger.New())
// Registra il controller alla route root "/"
mvc.New(app).Handle(new(ExampleController))
// Può anche essere registrato in un percorso specifico con l'ausilio dei gruppi di route
// Esempio: Registra il controller sotto il percorso /books
// mvc.New(app.Party("/books")).Handle(new(ExampleController))
}
func main() {
// Crea l'applicazione
app := newApp()
// http://localhost:8080
// http://localhost:8080/ping
// http://localhost:8080/hello
// http://localhost:8080/custom_path
app.Listen(":8080")
}
// Definisci ExampleController per gestire le richieste per "/", "/ping" e "/hello".
type ExampleController struct{}
// Gestisci la richiesta GET
// URL della richiesta: http://localhost:8080
func (c *ExampleController) Get() mvc.Result {
return mvc.Response{
ContentType: "text/html",
Text: "<h1>Benvenuto</h1>",
}
}
// GetPing serve
// Metodo: GET
// URL della richiesta: http://localhost:8080/ping
func (c *ExampleController) GetPing() string {
return "pong"
}
// GetHello serve
// Metodo: GET
// URL della richiesta: http://localhost:8080/hello
func (c *ExampleController) GetHello() interface{} {
return map[string]string{"message": "Ciao Iris!"}
}
// GetHelloWorld serve
// Metodo: GET
// URL della richiesta: http://localhost:8080/hello/world
func (c *ExampleController) GetHelloWorld() interface{} {
return map[string]string{"message": "Ciao Iris! DefaultPath"}
}
Relazione tra il routing MVC e la regola di denominazione delle funzioni del controller.
Indirizzo della Route: Gruppo della Route + Nome del metodo HTTP + Nome della funzione (in minuscolo)
Per esempio:
func (c *ExampleController) GetPing() string {
return "pong"
}
Poiché non è stato impostato alcun gruppo di route, questa funzione può gestire le richieste GET per la route http://localhost:8080/ping.