【发布时间】:2013-12-02 06:38:02
【问题描述】:
我对 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 并尝试了以下方法:
- http://www.nuget.org/packages/WebApi.PartialResponse/ - 安装此软件包导致程序集版本错误。
- 在 Product 字段上添加 ShouldSerialize 方法。由于这里不再赘述,这种方法有点麻烦。
- 查看了ASP.NET Web API partial response Json serialization,但那里似乎没有确定的答案。
- ASP.NET WebApi and Partial Responses 建议使用具有所有可为空字段的产品类。我不确定我是否完全理解在那里做什么。
有什么简单的方法可以做我想做的事吗?
要不然你能推荐一个比我现在做的更好的 API 设计吗?
【问题讨论】:
-
也许您可以在 /api/products 返回一个匿名类型,然后返回您的详细产品类型 /api/products/10。
-
感谢@jtlowe - /api/products 和 /api/products/10 都通过实体框架检索 Product 对象,因此我们在这两种情况下都拥有完整的 Product 对象。当然,既然我们已经在 /api/products 上拥有了完整的 Product 对象,那么肯定有某种方法可以只返回 List
但省略了一些属性? -
取决于数据库的大小/设置,可能还有序列化程序。听起来您只想加载 /api/products 所需的信息,而不是完整的 Product。如果您从 Products 表中检索所有完整记录,则可能会影响性能,这听起来像是您试图避免的。马丁的回答是一个很好的方法。另请查看支持 OData 查询。这样可以更轻松地进行过滤等。
-
主要的性能问题是在响应中将大量数据传递给客户端,而不是数据库拉取。在这方面,Martin 的方法听起来不错,但我看不出它是可扩展的。例如,如果我们要引入 /api/stores/1/products 来返回 Product 对象但这次只公开 ID、名称和 SKU 编号怎么办?我们现在需要创建另一种类型的 Product 类吗?
-
在您刚刚概述的情况下,您可以对 /api/products 和 /api/store/1/products 使用相同的初始 Product 对象。对于 ProductDetail 视图 - 您可以对 /api/products/10 进行 api 调用,而不是继续向下 /api/store/1/products/10。
标签: c# asp.net-mvc json asp.net-web-api