使用WebAPI进行搜索

时间:2012-07-25 10:52:38

标签: asp.net-mvc-4 asp.net-web-api

我为我的Customer模型制作了一个Web API类。我有标准方法(GET,POST,PUT,DELETE)。问题是,我想实现另一个搜索GET方法。像这样:

[HttpGet]
public IEnumerable<Customer> Search(string id)
{
    var customers = customerRepository.Search(id);
    return customers;
}

搜索方法使用.Contains()方法根据客户的帐号执行搜索。

问题是,当我导航到:mySite.com/api/Customers/Search/123时,我得到了404.我在这里做错了什么?

2 个答案:

答案 0 :(得分:48)

虽然Darin的答案始终是最高质量的,但这个问题实际上会受益于一个答案,该答案解释了如何在任何API中实际执行搜索,分页和过滤以及如何使用最新版本的Web API(v2) )。

我认为这是一个很好的资源(技术独立): http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api

答案还应该反映ASP.NET Web API v2中的新功能,因为Darin的答案很老。

由于这个问题出现在谷歌搜索“asp.net web api search”时,我会尝试在这里解释一些事情。

要使用最新版本的ASP.NET Web API(v2)尽可能接近REST原则,应该认真研究最新版本中引入的属性路由。使用旧的,经典的,基于约定的路由(在global.asax.cs或RouteConfig.cs中)实现RESTful路由非常困难。

你应该在这里阅读更多相关信息 http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

现在,详细了解如何实现您询问的细节。

最常见的做法是通过查询字符串参数公开这些类型的功能。

根据REST原则,您的Customers资源应该有一个端点,例如

/api/customers

要实现这一点,您可以在Web API控制器中装饰您的GetCustomers(),如下所示

[HttpGet]
[Route("/api/customers")]
public HttpResponseMessage GetCustomers(string q="", string sortBy="", string sortDirection="", bool active=true, ...)
{ 
// q = being optional search query
// sortBy = optional sort by column/property
// sortDirection = optional sort direction
// active = filter on 'active' column/property
// ... other filters may be applicable
}

如果您想提供过滤后的视图,那么您可以将此操作与您在经典MVC中所做的操作紧密相关。

对于某些自定义边缘情况,我只会在真正需要时引入新的控制器和自定义操作。

关于SearchFilter强类型对象的注释,让我们解释一下,这不会开箱即用,因为默认模型绑定器在使用GET请求时不会绑定到此类。

所以我要么从SearchFilter类中取出这些属性并将它们放在动作本身上,这样它们就可以通过查询字符串绑定器绑定,或者如果你想从请求体绑定,可以使用[FromBody]绑定器。根据{{​​3}}

HTH

答案 1 :(得分:8)

根据默认路由设置,只允许使用标准控制器操作名称(RESTful操作名称和调度基于HTTP谓词完成)。如果您想违反RESTful约定并使用一些自定义操作名称,则必须修改路由设置,以便在URL:api/{controller}/{action}/{id}中包含操作名称。现在,您可以向/api/Customers/Search/123发送请求,该请求将调用Customers API控制器上的“搜索”操作。