如何在c#中构建部分项RESTful API?

时间:2013-08-26 18:12:01

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

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

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

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

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

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

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

详细说明可在Google代码博客条目中找到:Making APIs Faster: Introducing Partial Response and Partial Update

Some other posts here表明这超出了ASP.NET WebAPI的当前能力。 ServiceStack或其他一揽子方案会帮助我们实现目标吗?

3 个答案:

答案 0 :(得分:2)

尝试此项目:https://github.com/AnthonyCarl/ServiceStack.PartialResponse作为问题的部分响应方

  

ServiceStack.PartialResponse.ServiceModel

     

Google Style Partial   ServiceStack.Net的响应。目前只有以下内容   支持类型:

     
      
  • application / json
  •   
  • application / jsv
  •   
  • text / html
  •   
  • 目前不支持application / xml。
  •   
     

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

     

提供场选择器

     

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

答案 1 :(得分:2)

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

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

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

  

在使用域模型时,我们实际上在ajax调用...

的视图中请求的数据超出了所需数量

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

答案 2 :(得分:1)

您可以使用OData Protocol,查看this example。 它可以使用键:$ select,$ expand,$ filter for search,选择一些fileds。 最重要的是,ASP.NET WEB API有一个支持此功能的SDK。