2012-09-30 45 views
6

¿Qué enfoque debo usar si deseo devolver solo algunos campos del modelo? Quiero ser capaz de pedir algunos campos, algo como esto:?Devolver algunos campos de ASP.NET Web API

campos = correo electrónico, fecha_de_caducidad, avatar (thumb_width, thumb_height, thumb_url)

Esta expresión podría ser también de cabecera en el solicitud. También tengo objetos anidados, como el Avatar dentro del Usuario.

Esto me va a salvar cientos de MB de tráfico, ya que algunos de mis modelos son los realmente pesados.

ACTUALIZACIÓN: Selección de la parcela debe trabajar tanto con las respuestas JSON y XML.

Respuesta

2

que sustituiría a la resolución de contrato por omisión (ver http://frankapi.wordpress.com/2012/09/09/going-camelcase-in-asp-net-mvc-web-api/) con uno personalizado, reemplazar el método GetSerializableMembers de la clase Newtonsoft.Json.Serialization.DefaultContractResolver y filtrar sus resultados con el valor de los campos de cadena de consulta.

Si puede acceder a la cadena de consulta de esa clase es otra cuestión, puede utilizar el httpcontext.corriente estático para obtenerlo, pero puede haber una opción más clara.

+0

Tengo un ejemplo aquí que eliminará condicionalmente las propiedades de un objeto de serialización JSON. https://gist.github.com/33b5e6056c1d59e83b1a.git esto se puede conectar a la API de ASP.NET utilizando los detalles que se muestran aquí http://tostring.it/2012/07/18/customize-json-result-in-web -api / –

6

He encontrado un paquete Nuget que hace esto para usted

WebApi.PartialResponse

Git código fuente del cubo:
https://github.com/dotarj/PartialResponse

En esencia envuelve el formateador se discutió anteriormente, por lo que sólo tiene que configurar es así:

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

Luego, puede especificar ?fields=<whatever> en su solicitud, y devolverá el modelo con solo los campos especificados.

0

También podría usar OData. Le da mucha flexibilidad sobre cómo quiere consultar y API. http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint

En su caso, se usaría $ seleccionar. También estoy adivinando que Avatar es otra clase, por lo que usaría $ expand para eso.

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

no estoy 100% si la sintaxis de la subselección es correcto, pero yo creo que es.

Cuestiones relacionadas