使用WebAPI进行搜索

Cal*_*ass 13 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;
}
Run Code Online (Sandbox Code Playgroud)

搜索方法使用该.Contains()方法基于客户的帐号执行搜索.

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

mar*_*are 50

虽然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
Run Code Online (Sandbox Code Playgroud)

为此,您将在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
}
Run Code Online (Sandbox Code Playgroud)

如果要提供过滤后的视图,可以将此操作与经典MVC中的操作紧密实现.

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

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

因此,我要么将这些属性从SearchFilter类中取出并将它们放在动作本身上,这样它们就可以通过查询字符串绑定器进行绑定,或者[FromBody]如果要从请求主体绑定,则使用绑定器.根据http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

HTH


Dar*_*rov 8

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

  • 如果你需要接受复杂类型作为参数而不是使用GET的字符串,你将如何实现搜索?即"公共IEnumerable <客户>搜索(SeachFilter过滤器)" (3认同)
  • 您创建另一个控制器:SearchProductsContoller或其他任何,然后使用其中的Get操作. (2认同)