Asp.net Restful MVC Web Api继承
我正在为自己构建一个asp.NETMVC4WebAPI 我已经经历了一段时间,我认为他们很好。使用Http动词。资源是名词,它与存储库等有关 但有一件事真的让我心烦 我的印象是这Asp.net Restful MVC Web Api继承,asp.net,asp.net-mvc,asp.net-mvc-routing,asp.net-mvc-4,asp.net-web-api,Asp.net,Asp.net Mvc,Asp.net Mvc Routing,Asp.net Mvc 4,Asp.net Web Api,我正在为自己构建一个asp.NETMVC4WebAPI 我已经经历了一段时间,我认为他们很好。使用Http动词。资源是名词,它与存储库等有关 但有一件事真的让我心烦 我的印象是这http://www.myurl.com/api/sellers/{id}/products是restful且GEThttp://www.myurl.com/api/products?$filter=sellerID eq{id}不可用 在我读到的关于新web api的内容中,我看到的只是前者和后者 后者是否有本土支持?
http://www.myurl.com/api/sellers/{id}/products
是restful且GEThttp://www.myurl.com/api/products?$filter=sellerID eq{id}
不可用
在我读到的关于新web api的内容中,我看到的只是前者和后者
后者是否有本土支持?如果没有,是否有办法在不发送所有内容的情况下执行
编辑-
我正在寻找允许
GET的东西http://www.myurl.com/api/sellers/{id}/products
和GEThttp://www.myurl.com/api/products
etc
更新:
这个问题暂时没有意义,我已经解决了,但这就是为什么第一个答案没有标记为正确的原因
更新:
与MilkyWayJoe聊天后,我们讨论了将
/Seller/2/产品
转换为/Products?$filter=sellerID eq 2
。有人知道怎么做吗?urlhttp://www.myurl.com/api/products?$filter=sellerID eq{id}
正在使用过滤器,当控制器以IQuerable
的形式返回集合时,Web API中的过滤器会立即使用。VS 2012中的默认值当前设置为IEnumerable
,不支持OData
您可以找到有关这方面的更多信息。可以使用嵌套资源(至少在URL构造中是这样),但MVC中没有太多对的支持;大部分工作你得自己做 首先,您需要创建一条路线来处理您的结构:
url: "sellers/{sellerId}/products",
defaults: new { controller = "sellers", action = "GetProducts" }
然后,您需要在“Sellers”控制器上创建GetProducts
操作,此路由应将呼叫者引导到:
[HttpGet]
public IEnumerable<Product> GetProducts(int sellerId)
{
//TODO: Add query to return results.
}
[HttpGet]
公共IEnumerable GetProducts(int-sellerId)
{
//TODO:添加查询以返回结果。
}
sellerId
参数将通过路由传入,并应用于驱动查询
这种方法的主要缺点是,自定义路由使得为资源之间的链接生成URL变得更加困难,当它们变得更复杂时,它们可以开始匹配您不希望它们匹配的URL。我正在寻找解决您同样问题的方法。我目前正在测试这个解决方案 首先,改变路线:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{action}/{id2}",
defaults: new { id = RouteParameter.Optional, action = "Index", id2 = RouteParameter.Optional }
);
然后,如果您想要一个SellersController
,请按常规编写,但要将所有操作命名为“Index”,并使用符号正确路由http谓词。例如:
[HttpGet]
public List<Seller> Index()
{}
这样你就可以打电话了
GET /api/sellers
or GET /api/sellers/99/products
or GET /api/sellers/99/products/2
我实际上正在测试这种方法,因此任何反馈都将不胜感激 对不起,我无意中说了后者,而我指的是前者。我已经编辑并修复了这个问题。@MrJD请看编程英雄的回答。它基本上是一种不同的路由模式,类似于rails的路由。检查一下,你会发现还有其他类似的路径,例如,
GET/people/1/edit
,它本质上是一个GET,我只是在GET前面加上了明确定义动词的前缀。这不一定与这个问题有关。该方法需要我为每个端点路由每个嵌套情况。我希望有一种方法可以从中抽象出来,我不知道你还能如何注册基于FK的查询路由(可能是因为我缺乏url路由的经验)。我通常为这些场景注册类似的路由,同样,这是一个非常类似于rails和/或sinatra路由的约定(如果不完全相同的话),所以我想您必须注册这些其他路由。是否可以注册一个“嵌套”区域,例如`{nestedArea}/products',然后以某种方式将其转换为OData?或者以某种方式使用iquirable结果?我的问题指定了“不发送所有内容”。这是可行的,但是我不想为一个端点创建4条深嵌套路由。只是效率不高。唉,正如我所说,MVC4不能自然地支持您正在尝试做的事情。通过在路由中定义更多参数,您可以使路由重复使用,但最终,如果您希望将特定URL解析为特定操作和控制器,路由系统就是为了解决这个问题而设计的。我只是在寻找可变路由。阅读MilkyWayJoe答案评论的最后部分。我提到将路由参数转换为OData结构,这很聪明。然而,它的规模不像我想要的。例如。假设产品可以有评论,并且您希望为卖家142请求所有评论。请求看起来像:/sellers/142/products/reviews。这是一个3级的要求。遗憾的是,您的示例最多可以处理两个问题
GET /api/sellers
or GET /api/sellers/99/products
or GET /api/sellers/99/products/2