Asp.net mvc 4 使用WebAPI进行搜索

Asp.net mvc 4 使用WebAPI进行搜索,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,我为我的客户模型制作了一个web API类。我有标准的方法(GET、POST、PUT、DELETE)。问题是,我想实现另一个GET方法,即搜索。大概是这样的: [HttpGet] public IEnumerable<Customer> Search(string id) { var customers = customerRepository.Search(id); return customers; } [HttpGet] 公共IEnumerable搜索(字符串

我为我的
客户
模型制作了一个web API类。我有标准的方法(GET、POST、PUT、DELETE)。问题是,我想实现另一个GET方法,即搜索。大概是这样的:

[HttpGet]
public IEnumerable<Customer> Search(string id)
{
    var customers = customerRepository.Search(id);
    return customers;
}
[HttpGet]
公共IEnumerable搜索(字符串id)
{
var customers=customerRepository.Search(id);
返回客户;
}
搜索方法使用
.Contains()
方法基于我的客户的帐号执行搜索


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

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

虽然Darin的答案总是高质量的,但这个问题实际上会从解释如何搜索的答案中受益,分页和过滤实际上应该在任何API中完成,以及如何使用最新版本的WebAPI(v2)完成

这是一个我认为这是一个很好的资源的问题(技术问题):

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

由于这个问题在谷歌搜索“asp.NETWebAPI搜索”时出现在顶部,我将尝试在这里解释一些事情

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

你应该在这里多读一些

现在,来详细说明如何实现您所询问的细节

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

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

/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]
绑定器(如果您想从请求主体进行绑定)。依照


HTH

那么,我如何使用RESTful方式实现这一点呢?因为我不能使用另一个GET方法..您可以创建另一个控制器:SearchProductsContoller或其他什么,然后在其中使用GET操作。啊。。正如我所想的那样,那通常会发生什么呢?为您可能需要的每个附加GET请求提供一个新控制器?它是每个资源的一个控制器。在REST中,我们将实体称为资源。如果需要接受复杂类型作为参数而不是使用GET作为字符串,您将如何实现搜索?i、 e.“公共IEnumerable搜索(SeachFilter筛选器)”精彩的答案,感谢对旧问题的新答案。