6

如果我只想从模型中返回一些字段,我应该使用什么方法?我希望能够询问一些字段,例如:

?fields=email,expiration_date,头像(thumb_width,thumb_height,thumb_url)

此表达式也可以是请求中的标头。我也有嵌套对象,比如用户内部的头像。

这将为我节省数百 MB 的流量,因为我的一些模型非常重。

更新:字段选择应该适用于 Json 和 XML 响应。

4

3 回答 3

6

I found a nuget package that does this for you

WebApi.PartialResponse

Git hub source code:
https://github.com/dotarj/PartialResponse

It essentially wraps the formatter discussed above, so that you only have to configure it like this:

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

Then, you can specify ?fields=<whatever> in your request, and it will return the model with only those fields specified.

于 2014-10-09T17:29:36.093 回答
2

我会用自定义的替换默认的合同解析器(参见http://frankapi.wordpress.com/2012/09/09/going-camelcase-in-asp-net-mvc-web-api/),覆盖 GetSerializableMembers来自 Newtonsoft.Json.Serialization.DefaultContractResolver 类的方法,并使用查询字符串字段的值过滤其结果。

是否可以从该类访问查询字符串是另一个问题,您可以使用静态 httpcontext.current 来获取它,但可能有更清洁的选择。

于 2012-10-01T03:52:51.363 回答
0

您也可以使用 OData。它在查询方式和 API 方面为您提供了很大的灵活性。 http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint

在您的情况下,您将使用$select。我也猜测 Avatar 是另一个类,所以你会使用$expand

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

如果子选择的语法正确,我不是 100%,但我认为它是正确的。

于 2015-10-19T14:22:29.870 回答