Nello script precedente abbiamo mostrato uno dei possibili approcci per la gestione, nell'ambito di chiamate in GET, di tipi complessi quali gli array. La soluzione adottata ci ha permesso di rappresentare un array in un URL ripetendo la stessa chiave più volte in querystring:
http://localhost:11334/api/customers/?id=1&id=2&id=3
Come abbiamo già avuto modo di segnalare, però, questo approccio risulta davvero verboso e poco leggibile. Sarebbe molto più semplice, invece, poter sfruttare una sintassi simile alla seguente:
http://localhost:11334/api/customers/?id=1,2,3
Questa personalizzazione richiede però la creazione di un nostro model binder, che sia in grado di tradurre la stringa "1,2,3" in un array di interi. Un model binder, in ASP.NET Web API non è altro che una classe che implementa l'interfaccia IModelBinder e, ovviamente, il metodo BindModel:
public class CommaArrayModelBinder<T> : IModelBinder { public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) { // implementazione qui } }
Come possiamo notare, il nostro model binder è un tipo generico, così che possiamo utilizzarlo con ogni tipo che possa essere convertito a partire da una stringa. L'implementazione consiste, come possiamo aspettarci, nel prelevare il valore dalla querystring, effettuarne il parsing e finalmente restituire l'array che la action si aspetta:
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) { var values = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); var rawValue = (string)values.RawValue; var converter = TypeDescriptor.GetConverter(typeof(T)); var result = rawValue.Split(',') .Select(x => (T)converter.ConvertFrom(x)) .ToArray(); bindingContext.Model = result; return true; }
Una prima caratteristica che possiamo notare è che, grazie all'astrazione rappresentata dai ValueProvider, non dobbiamo preoccuparci del fatto che, effetticamente, il dato provenga dalla querystring o magari da un parametro di routing. Una volta recuperato il valore nell'URI, possiamo sfruttare il TypeConverter per il tipo T che vogliamo ottenere per trasformare la string in un array.
L'ultimo step è indicare al runtime di utilizzare questo model binder per il nostro array:
public string Get( [ModelBinder(typeof(CommaArrayModelBinder<int>))]int[] id) { // implementazione qui }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Eseguire operazioni con timeout in React
Installare le Web App site extension tramite una pipeline di Azure DevOps
Verificare la provenienza di un commit tramite le GitHub Actions
Usare il versioning con i controller di ASP.NET Core Web API
Gestire liste di tipi semplici con Entity Framework Core
Gestire i null nelle reactive form tipizzate di Angular
Eseguire le GitHub Actions offline
Disabilitare automaticamente un workflow di GitHub
Evitare la script injection nelle GitHub Actions
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
Usare un KeyedService di default in ASP.NET Core 8
Effettuare chiamate con versioning da Blazor ad ASP.NET Core
I più letti di oggi
- Miglioramenti nelle performance di Angular 16
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- HTML5 con CSS e JavaScript
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Ottimizzazione dei block template in Angular 17
- Disabilitare automaticamente un workflow di GitHub (parte 2)