【问题标题】:Return some fields from ASP.NET Web API从 ASP.NET Web API 返回一些字段
【发布时间】:2015-10-19 22:22:29
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我找到了一个 nuget 包,可以为你做这件事

    WebApi.PartialResponse

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      【解决方案3】:

      您也可以使用 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%,但我认为它是正确的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-05
        • 2018-07-17
        • 2015-01-10
        • 2013-06-23
        • 2016-04-23
        • 2013-09-21
        相关资源
        最近更新 更多