【问题标题】:How to build partial items RESTful API in c#?如何在 C# 中构建部分项目 RESTful API?
【发布时间】:2013-08-27 09:29:58
【问题描述】:

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

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

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

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

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

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

详细描述可以在谷歌代码博客条目中找到:Making APIs Faster: Introducing Partial Response and Partial Update

Some other posts here 建议这超出了ASP.NET WebAPI 当前的能力。 ServiceStack 或其他软件包会帮助我们实现目标吗?

【问题讨论】:

    标签: rest facebook-graph-api asp.net-web-api servicestack


    【解决方案1】:

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

    ServiceStack.PartialResponse.ServiceModel

    谷歌风格部分 ServiceStack.Net 的响应。目前只有以下内容 支持类型:

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

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

    提供字段选择器

    字段选择器可以使用标题或查询字符串传递。经过 默认字段选择器是两者的组合形式。重复字段 选择器减少了。字段选择器应用于所有条目 如果选择器引用列表,则为列表。

    【讨论】:

    • 感谢您的回复。但是这个PartialResponse项目是成熟的产品吗?目前只有 1 个贡献者和 51 个提交。现在有教程或示例代码吗?
    • 这不是我的项目,所以我真的不能给你一个明确的答案。我建议在 github 上记录你的问题。
    【解决方案2】:

    有几个选项可以在 ServiceStack 中实现部分更新。请参阅this question about implementing PATCH requests 了解使用可空值的请求 DTO 的方法,以及 ServiceStack 中的PopulateWithNonDefaultValues 和类似扩展方法,以获取 PATCH 样式的请求,其中客户端可以发送请求正文中的任何字段子集。如果请求正文中不存在给定字段,则不会更新域对象的该属性。

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 谢谢!该解决方案看起来最接近我们的需要。可能这就是 WebAPI 不包含 PartialResponse 函数的原因。我试图搜索您提到的 WebAPI SDK,但找不到任何东西。你能给我们发个链接吗?但我确实找到了一堆我可以研究的例子。 [bit.ly/19WIUuE]谢谢你为我指明了一个全新的方向。
      • 很高兴为您提供帮助。您可以在 Nuget 上获得它的 SDK,搜索 oData。这是用于 OData 的 tutorials,以及他们在 codeplex 的 source code。我在 github 上开发了一个使用 OData 的站点,source
      猜你喜欢
      • 2011-06-08
      • 2021-11-02
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多