Quando creiamo delle RESTful API, è piuttosto comune avere dei parametri nel path comuni a più action. Immaginiamo per esempio di avere a che fare con un programma di chat. L'endpoint che ci permette di recuperare gli ultimi messaggi di una particolare "Room" potrebbe avere un URL simile al seguente, in cui il path "messages" appare dopo il parametro "5", ossia l'ID della room.
Come possiamo modellare un simile URL nel routing di ASP.NET Core?
Se abbiamo creato un MessagesController, specifico per i messaggi, probabilmente avremo configurato un routing simile al seguente, in cui roomId è un parametro della route a livello di controller - e non di singola action, come più spesso accade.
[Route("rooms/{roomId:int}/[controller]")] [ApiController] public class MessagesController : ControllerBase { ... }
Come possiamo accedere a un tale parametro nel nostro codice?
Una prima possibilità è quella di aggiungere questo parametro al metodo della action:
[HttpGet] public string Get(int roomId) { return $"Room {roomId} has no messages"; }
Questo sistema funziona anche se il parametro - come nel nostro caso - non è presente nel routing specifico della action, ma è definito nel suo parent (il controller). Si tratta di una tecnica molto semplice, che però ha il difetto di duplicare questo parametro ovunque nel codice. Nel caso dovessimo cambiarne il nome o il tipo, dovremmo andare a modificare ogni singola action che lo utilizzi.
Alternativamente, possiamo pensare di esporlo come proprietà nel controller stesso:
[Route("rooms/{roomId:int}/[controller]")] [ApiController] public class MessagesController : ControllerBase { public int RoomId => int.Parse( this.HttpContext.Request.RouteValues["roomId"].ToString()); [HttpGet] public string Get() { return $"Room {this.RoomId} has no messages"; } }
In questo modo, possiamo evitare di includere il parametro nelle singole action, che possono leggerne il valore tramite la proprietà appena creata.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Load test di ASP.NET Core con k6
Gestire i null nelle reactive form tipizzate di Angular
Effettuare chiamate con versioning da Blazor ad ASP.NET Core
Potenziare Azure AI Search con la ricerca vettoriale
Evitare la command injection in un workflow di GitHub
.NET Conference Italia 2023
Evitare la script injection nelle GitHub Actions
Mascherare l'output di un valore all'interno dei log di un workflow di GitHub
Effettuare lo stream della risposta in ASP.NET Core tramite IAsyncEnumerable
Limitare le richieste lato server con l'interactive routing di Blazor 8
Eseguire operazioni sui blob con Azure Storage Actions
I più letti di oggi
- Ottenere il nome esteso del mese
- Eventi personalizzati per l'HealhMonitoring di ASP.NET 2.0
- Ritardata l'uscita di BizTalk Server 2004
- dal tuo PC o smartphone tra poco #aspilive: https://aspit.co/VS2015-live tutto su #vs2015, #windows10, #aspnet5 e altro ancora!
- Utilizzare DPAPI: cifrare dati sensibili
- Utilizzare .NET Core e IoC nelle Azure Function
- Amministrare gli utenti Azure B2C con .NET
- Utilizzare WebAssembly con .NET, ovunque
- Sblocca le performance della tua applicazione con .NET 8