Routing Avanzato
Il routing avanzato in Goa ti permette di gestire pattern URL complessi e scenari di routing sofisticati. Questa sezione copre le funzionalità avanzate di routing disponibili nel DSL HTTP di Goa.
Parametri del Percorso
I parametri del percorso sono segmenti variabili nell’URL che catturano valori dinamici. Goa fornisce un supporto completo per la definizione e la gestione dei parametri del percorso.
Sintassi di Base
I parametri del percorso sono definiti usando le parentesi graffe {}:
var _ = Service("users", func() {
Method("show", func() {
HTTP(func() {
GET("/users/{id}") // Parametro semplice
GET("/users/{id}/posts/{postId}") // Parametri multipli
})
})
})
Pattern Matching
Puoi applicare pattern di corrispondenza ai parametri del percorso:
var _ = Service("files", func() {
Method("download", func() {
HTTP(func() {
// Corrisponde solo a ID numerici
GET("/files/{id:[0-9]+}")
// Corrisponde a nomi file con estensione
GET("/files/{filename:[^/]+\\.(?:jpg|png|gif)}")
})
})
})
Parametri Opzionali
I parametri del percorso possono essere resi opzionali usando il carattere ?:
var _ = Service("blog", func() {
Method("posts", func() {
HTTP(func() {
// Il parametro year è opzionale
GET("/posts/{year?:[0-9]{4}}")
})
})
})
Gestione delle Query String
Le query string permettono di passare parametri opzionali e filtri attraverso l’URL. Goa fornisce un supporto robusto per la gestione delle query string.
Parametri di Base
Definisci parametri di query string usando il DSL Param:
var _ = Service("products", func() {
Method("search", func() {
HTTP(func() {
GET("/products")
Param("q") // Parametro di ricerca
Param("category") // Filtro per categoria
Param("sort") // Ordinamento
})
})
})
Array e Mappe
Goa supporta array e mappe nelle query string:
var _ = Service("filter", func() {
Method("apply", func() {
HTTP(func() {
GET("/filter")
// Array: ?tags=tag1,tag2,tag3
Param("tags", ArrayOf(String))
// Mappa: ?filters[color]=red&filters[size]=large
Param("filters", MapOf(String, String))
})
})
})
Parametri Opzionali e Valori Predefiniti
Configura parametri opzionali con valori predefiniti:
var _ = Service("pagination", func() {
Method("list", func() {
HTTP(func() {
GET("/items")
Param("page", Int32, func() {
Default(1) // Valore predefinito
Minimum(1) // Validazione
})
Param("per_page", Int32, func() {
Default(20) // Valore predefinito
Minimum(1)
Maximum(100) // Limiti
})
})
})
})
Route con Caratteri Jolly
Le route con caratteri jolly permettono di catturare segmenti di percorso multipli o sconosciuti.
Cattura di Percorsi Multipli
Usa * per catturare segmenti di percorso rimanenti:
var _ = Service("files", func() {
Method("serve", func() {
HTTP(func() {
// Cattura qualsiasi percorso sotto /static/
GET("/static/*filepath")
})
})
})
Pattern con Caratteri Jolly
Combina caratteri jolly con pattern matching:
var _ = Service("api", func() {
Method("proxy", func() {
HTTP(func() {
// Cattura percorsi che iniziano con v1 o v2
GET("/api/{version:v[12]/*}")
})
})
})
Migliori Pratiche
Linee Guida per il Routing
Chiarezza dei Percorsi
- Usa nomi descrittivi per i parametri
- Mantieni una gerarchia logica
- Documenta il significato dei parametri
Validazione
- Applica pattern matching quando possibile
- Valida i parametri obbligatori
- Fornisci valori predefiniti sensati
Consistenza
- Usa convenzioni di naming coerenti
- Mantieni una struttura URL uniforme
- Standardizza i formati dei parametri
Argomenti Correlati
- Per la gestione dei contenuti, vedi Negoziazione dei Contenuti
- Per l’integrazione WebSocket, vedi Integrazione WebSocket
- Per la gestione degli errori, vedi Gestione degli Errori
- Per i pattern di middleware, vedi Middleware