2

似乎大多数 WebAPI 示例都返回了一些模型(域模型或特定视图模型)。

当使用域模型时,我们实际上从 ajax 调用中请求的数据比视图中需要的更多,然后使用 JavaScript 构建我们的视图模型(假设我们正在构建一个 Web 应用程序)。

我尝试为每个页面(视图)使用不同的视图模型,这样可以减少网络占用并仅返回需要的字段。但是在 ApiController 中我会有太多的 GET 方法。而且我们不可能预测未来的需求并构建一个返回各种视图模型的 API。

我想模仿 Facebook Graph API 并构建一个类似的 uri:

http://... api/games/333?fields=id, name, price, imageUrl

我们的用户应该能够只用这几个字段更新记录。

可以在 google 代码博客条目中找到详细描述:使 API 更快:引入部分响应和部分更新

这里的其他一些帖子表明这超出了ASP.NET WebAPI. 或其他一些包会ServiceStack帮助我们实现目标吗?

4

3 回答 3

2

试试这个项目:https ://github.com/AnthonyCarl/ServiceStack.PartialResponse问题的部分响应方面

ServiceStack.PartialResponse.ServiceModel

ServiceStack.Net 的 Google 样式部分响应。目前仅支持以下内容类型:

  • 应用程序/json
  • 应用程序/jsv
  • 文本/html
  • 当前不支持 application/xml。

我想将其实现为 ServiceStack IPlugin,但我无法弄清楚如何获得对我的方法所需的响应 DTO 的访问权限。目前,这是作为 IRequestContext 扩展实现的。

提供字段选择器

字段选择器可以使用标题或查询字符串传递。默认情况下,字段选择器是由两者组合而成的。减少了重复的字段选择器。如果选择器引用列表,则字段选择器将应用于列表中的所有条目。

于 2013-08-26T19:11:21.357 回答
2

在 ServiceStack 中实现部分更新有几个选项。请参阅这个关于实现 PATCH 请求的问题,该方法使用具有可为空值的请求 DTO 以及PopulateWithNonDefaultValuesServiceStack 中的类似扩展方法来接受 PATCH 样式的请求,其中客户端可以发送请求正文中的任何字段子集。如果请求正文中不存在给定字段,则不会更新域对象的该属性。

如果您确实需要使用查询字符串来指定应更新的字段子集,那么您仍然可以使用上述方法,但添加一些代码,首先将传入请求 DTO 对象中未命名的任何值清空在查询字符串中。然后您可以再次使用PopulateWithNonDefaultValues将剩余的值复制到域对象。

另外,要评论与我刚刚给出的建议密切相关的帖子的另一部分:

使用域模型时,我们实际上从 ajax 调用中请求的数据比视图中需要的更多......

这里是基于消息的设计有用的地方:将您的请求/响应消息建模为单独的 DTO 类,而不是重用和公开您的内部域模型对象。在众多好处中,您将消除在请求/响应模型中暴露不必要字段的问题。基于消息的设计是推动 ServiceStack 实施的核心概念之一。但是,您可以使用 Web API 或 MVC 获得类似的结果。我强烈推荐阅读这篇讨论这种设计如何在 ServiceStack 中工作的文章。

于 2013-08-26T19:11:37.650 回答
1

你可以使用OData 协议,看这个例子。它可以使用 key:$select,$expand,$filter 进行搜索,选择一些文件。最重要的是,ASP.NET WEB API 有一个 SDK 来支持这一点。

于 2013-08-27T01:29:58.250 回答