如果我只想从模型中返回一些字段,我应该使用什么方法?我希望能够询问一些字段,例如:
?fields=email,expiration_date,头像(thumb_width,thumb_height,thumb_url)
此表达式也可以是请求中的标头。我也有嵌套对象,比如用户内部的头像。
这将为我节省数百 MB 的流量,因为我的一些模型非常重。
更新:字段选择应该适用于 Json 和 XML 响应。
如果我只想从模型中返回一些字段,我应该使用什么方法?我希望能够询问一些字段,例如:
?fields=email,expiration_date,头像(thumb_width,thumb_height,thumb_url)
此表达式也可以是请求中的标头。我也有嵌套对象,比如用户内部的头像。
这将为我节省数百 MB 的流量,因为我的一些模型非常重。
更新:字段选择应该适用于 Json 和 XML 响应。
I found a nuget package that does this for you
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.
我会用自定义的替换默认的合同解析器(参见http://frankapi.wordpress.com/2012/09/09/going-camelcase-in-asp-net-mvc-web-api/),覆盖 GetSerializableMembers来自 Newtonsoft.Json.Serialization.DefaultContractResolver 类的方法,并使用查询字符串字段的值过滤其结果。
是否可以从该类访问查询字符串是另一个问题,您可以使用静态 httpcontext.current 来获取它,但可能有更清洁的选择。
您也可以使用 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%,但我认为它是正确的。