Negli script precedenti abbiamo introdotto alcune novità di ASP.NET Core 2.1 relative a Web API e, in particolare, abbiamo accennato all'esistenza di una nuova classe ActionResult<T>.
Grazie a quest'ultima, possiamo finalmente realizzare action Web API fortemente tipizzate, senza rinunciare alla flessibilità di controllare l'effettivo contenuto della risposta.
Sin dalla sua introduzione, infatti, Web API supporta la restituzione di tipi nativi:
public Person GetById(int id) { return new Person>(); }
Tuttavia, il metodo precedente non consente di restituire risposte differenti da un'istanza di Person; nel caso in cui la Person richiesta non esiste, per esempio, vorremo poter restituire un errore 404.
Fino alla precedente versione di ASP.NET Core, l'unica alternativa era usare IActionResult come tipo della risposta:
public IActionResult GetById(int id) { Person result = personService.GetById(id); if (result == null) { return this.NotFound(); } return this.Ok(result); }
Questo approccio ovviamente soffre di un problema di tipizzazione: il metodo Ok, infatti, accetta un qualsiasi tipo in input, e pertanto perdiamo il controllo a compile time sulla correttezza del risultato.
Con ASP.NET Core 2.1, abbiamo a disposizione il nuovo tipo ActionResult<T>, che ci permette di riscrivere il metodo precedente in questo modo, forzando una validazione del tipo del risultato:
public ActionResult<Person> GetById(int id) { Person result = personService.GetById(id); if (result == null) { return this.NotFound(); } // ogni tipo diverso da Person genera un errore di compilazione return result; }
Come è possibile che il metodo in alto compili, visto che stiamo restituendo un oggetto di tipo Person invece che ActionResult
public sealed class ActionResult<TValue> : IConvertToActionResult { // ... altro codice qui ... public static implicit operator ActionResult<TValue>(TValue value); public static implicit operator ActionResult<TValue>(ActionResult result); }
Come possiamo notare, essa ridefinisce due implicit conversion operator:
- il primo, è proprio quello che ci consente di restituire un oggetto di tipo Person anche se la action si aspetta un ActionResult
- Il secondo, invece, ci permette di ritornare anche un qualsiasi altro ActionResult, se necessario, come NotFoundResult o BadRequestResult.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Effettuare chiamate con versioning da Blazor ad ASP.NET Core
Creazione di componenti personalizzati in React.js con Tailwind CSS
Effettuare lo stream della risposta in ASP.NET Core tramite IAsyncEnumerable
Verificare la provenienza di un commit tramite le GitHub Actions
C# 12: Cosa c'è di nuovo e interessante
Generare token per autenicarsi sulle API di GitHub
.NET Conference Italia 2023
Sostituire la GitHub Action di login su private registry
Semplificare il deployment di siti statici con Azure Static Web App
Utilizzare Azure AI Studio per testare i modelli AI
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Utilizzare un service principal per accedere a Azure Container Registry
I più letti di oggi
- annunciato #netstandard 2.1. .NET Core lo supporterà a partire da #netcore3, così come le prossime versione di #xamarin, #mono e #unity.il supporto per #netfx 4.8, invece, non ci sarà. https://aspit.co/bq2
- Annunciato Silverlight 4 RC e Windows Phone Developer Tools
- Speciale Razor: il nuovo view engine di WebMatrix e ASP.NET MVC
- Speciale Windows Store app: costruire app con WinRT per Windows 8
- Gestire lo stato all'interno di un class component di ReactJS
- Inserimenti bulk su database con la classe SqlBulkCopy di ADO.NET 2.0
- disponibile su MSDN la versione RTM di #VS2013 Update 2! https://aspit.co/auj #msTechEd