从ASP.NET Web API返回一些字段

时间:2012-09-30 15:05:57

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api json.net

如果我只想从模型中返回一些字段,我应该使用哪种方法?我希望能够提出一些字段,如下所示:

  

?字段=电子邮件,到期日期,化身(thumb_width,thumb_height,thumb_url)

此表达式也可以是请求中的标头。我也有嵌套对象,比如User中的Avatar。

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

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

3 个答案:

答案 0 :(得分:6)

我找到了一个为你做这个的nuget包

WebApi.PartialResponse

Git hub源代码:
https://github.com/dotarj/PartialResponse

它基本上包含了上面讨论的格式化程序,因此您只需要像这样配置它:

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

然后,您可以在请求中指定?fields=<whatever>,它将返回仅包含指定字段的模型。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

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

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

如果subselect的语法正确,我不是100%,但我认为是。