6

我正在为自己构建一个 asp.net mvc 4 web api

我看过微软的视频,我认为它们很好。使用了 Http 动词。资源是名词,存储库等等。

但有一件事真的让我很烦恼

我的印象是这GET http://www.myurl.com/api/sellers/{id}/products是宁静的,GET http://www.myurl.com/api/products?$filter = sellerID eq {id}而不是。

我在所读到的关于新 web api 的内容中所看到的只是前者

对后者有原生支持吗?如果没有,有没有办法在不路由所有内容的情况下做到这一点?


编辑-
我正在寻找允许的GET http://www.myurl.com/api/sellers/{id}/products东西GET http://www.myurl.com/api/products等等


更新:
这个问题暂时没有意义,我已经解决了这个问题,但这就是为什么第一个答案没有被标记为正确的原因。


更新:
与 MilkyWayJoe 聊天后,我们谈到了转换/Seller/2/Products/Products?$filter = sellerID eq 2. 有没有人知道如何才能做到这一点?

4

3 回答 3

3

该 urlhttp://www.myurl.com/api/products?$filter= sellerID eq {id}使用OData过滤器,当您的控制器将集合返回为IQuerable. 目前 VS 2012 中的默认设置为IEnumerable,不支持 OData。

您可以在此处此处找到更多相关信息。

于 2012-07-05T07:47:19.273 回答
3

可以有嵌套资源(至少在 URL 构造中),但在 MVC 中没有大量支持;您必须自己完成大部分工作。

首先,您需要创建一个路由来处理您的结构:

url: "sellers/{sellerId}/products",
defaults: new { controller = "sellers", action = "GetProducts" }

然后,您需要GetProducts在“卖家”控制器上创建操作,此路由应将调用者定向到:

[HttpGet]
public IEnumerable<Product> GetProducts(int sellerId)
{
    //TODO: Add query to return results.
}

sellerId参数将通过路由传入,并应用于驱动您的查询。

这种方法的主要缺点是自定义路由使得为资源之间的链接生成 URL 变得更加困难,并且当它们变得更加复杂时,它们可以开始匹配您没想到的 URL。

于 2012-07-05T12:31:24.837 回答
2

我正在寻找解决您同样问题的方法。我目前正在测试这个解决方案。

首先,更改路线:

    routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}/{action}/{id2}",
            defaults: new { id = RouteParameter.Optional, action = "Index", id2 = RouteParameter.Optional }
        );

然后,如果你想要一个SellersController,像往常一样写它,但将所有动作命名为“索引”并使用符号来正确路由 http 动词。例如:

     [HttpGet]
     public List<Seller> Index()
     {}

然后,在 中SellersController,创建将它们命名为“内部”对象 ( Products) 的操作。

     [HttpGet]
     public List<Product> Products(int id)
     {}

     [HttpGet]
     public Product Products(int id, int id2)
     {}

这样你就可以调用

     GET /api/sellers
     or GET /api/sellers/99/products
     or GET /api/sellers/99/products/2

我实际上正在测试这种方法,所以任何反馈都将不胜感激!

于 2012-07-11T15:42:37.070 回答