如何使用ASP.Net Web Api 2进行部分响应

qui*_*mes 12 c# asp.net-mvc json asp.net-web-api

我是API设计和MVC概念的新手,但据我所知,像GET/api/products这样的东西应该返回一个产品列表,而GET/api/products/1应该返回一个产品.在速度方面,我的感觉是/ api/products应该返回较少的信息,即id和name,而/ api/products/1应该返回更多,即id,name和description.

据我所知,处理此问题的最佳方法是不在/ api/products端点中返回产品类的某些字段.对于/ api/products?fields = name,这尤其必要.我正在使用ASP.Net Web Api 2并尝试了以下方法:

有什么简单的方法可以做我想做的事情吗?

否则你能建议一个比我正在做的更好的API设计吗?

dot*_*arj 7

您也可以使用WebApi.PartialResponse(http://www.nuget.org/packages/WebApi.PartialResponse/).这是我写的一个包,它使用LINQ to JSON(Json.NET)来操作返回的对象.它使用Google在其API中使用的字段语法,例如:

  • 字段=项/ ID,playlistItems /片断/标题,playlistItems /片断/位置
  • 字段=项(ID,段/标题,片段/位置)
  • 字段=项(ID,片段(标题,位置))

您可以在GitHub项目页面上找到更多信息:https://github.com/dotarj/PartialResponse.


Mar*_*oth 4

我建议在返回实体列表时使用单独的类进行映射。

特别是因为问题不仅在于您返回给用户的内容,还在于您从数据库中选择的内容。

因此,使获取和实体返回一个 Product 对象,并获取实体列表返回一个 ProductLink 对象或类似的东西。

编辑

根据 jtlowe 的评论,如果您有许多不同的方法返回产品属性的细微变化,请使用匿名类(尽管我怀疑这是否一定是一个好的设计)。

在你的行动中考虑这样的事情

return from p in this.context.Products
       select new
       {
           p.Id,
           p.Name,
           p.SKU
       };
Run Code Online (Sandbox Code Playgroud)

这:

  • 仅从数据库中选择您需要的列。
  • 不需要为产品的新变体定义额外的类

这并不容易将此语句的结果传递给其他方法,因为您只能将其作为 IEnumerable、对象或动态返回。如果您将其放入控制器中,那么它可能就足够了。如果您正在实现存储库模式,并且使用匿名类型,则将无法返回强类型列表。