2012-09-30 14 views
6

Quale approccio dovrei usare se voglio restituire solo alcuni campi dal modello? Voglio essere in grado di chiedere per alcuni campi, qualcosa di simile:?Restituire alcuni campi dall'API Web ASP.NET

campi = e-mail, expiration_date, avatar (thumb_width, thumb_height, thumb_url)

Questa espressione potrebbe essere di intestazione anche nel richiesta. Ho anche oggetti annidati, come l'Avatar all'interno dell'Utente.

Ciò mi farà risparmiare centinaia di MB di traffico, poiché alcuni dei miei modelli sono davvero pesanti.

AGGIORNAMENTO: la selezione dei campi dovrebbe funzionare sia con le risposte JSON che XML.

risposta

2

vorrei sostituire il risolutore del contratto di default (vedi http://frankapi.wordpress.com/2012/09/09/going-camelcase-in-asp-net-mvc-web-api/) con uno personalizzato, l'override del metodo GetSerializableMembers dalla classe Newtonsoft.Json.Serialization.DefaultContractResolver e filtrare i risultati con il valore dei campi QueryString.

se è possibile accedere querystring da quella classe è un'altra questione, si può essere in grado di utilizzare il HttpContext.Current statica per farlo, ma ci potrebbe essere una soluzione più pulita.

+0

Ho qui un esempio che rimuoverà in modo condizionale le proprietà da un oggetto serialize JSON. https://gist.github.com/33b5e6056c1d59e83b1a.git questo può essere scandagliato nell'API di ASP.NET usando i dettagli mostrati qui http://tostring.it/2012/07/18/customize-json-result-in-web -API / –

6

ho trovato un pacchetto NuGet che fa questo per voi

WebApi.PartialResponse

Git codice sorgente hub:
https://github.com/dotarj/PartialResponse

avvolge essenzialmente il formattatore discusso in precedenza, in modo da avere solo configurare in questo modo:

GlobalConfiguration.Configuration.Formatters.Clear(); 
GlobalConfiguration.Configuration.Formatters.Add(new PartialJsonMediaTypeFormatter() { IgnoreCase = true }); 

Quindi, è possibile specificare ?fields=<whatever> nella richiesta e restituirà il modello con solo i campi specificati.

0

Si potrebbe anche usare OData. Ti offre molta flessibilità nel modo in cui desideri eseguire query e API. http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint

Nel tuo caso, useresti $ seleziona. Immagino anche che Avatar sia un'altra classe, quindi useresti $ espandi per quello.

/api/endpoint?$select=email,expiration_date&$expand=avatar($select=thumb_width,thumb_height,thumb_url) 

io non sono al 100% se la sintassi per la subselect è giusto, ma penso che sia.

Problemi correlati