在ASP Web API 2中,我想在我的REST URI中实现搜索功能。
例如,如果我有资源客户
/base_url/customers
/base_url/customers/1
....
我想举例来说:
/base_url/customers?active=true
如何在Web API 2控制器中实现搜索? (我不想使用OData协议,因为我有DTO对象:我的控制器必须与DTO对象接口,而不是直接与模型对象接口)。
public class CustomerSearchOptions
{
public bool IsActive { get; set; }
public string AnotherProperty {get; set;}
}
[HttpGet]
[ResponseType(typeof(List<MyCustomerDto>))]
public async Task<IHttpActionResult> SearchAsync([FromUri] CustomerSearchOptions searchOptions)
{
if (searchOptions == null)
{
return BadRequest("Invalid search options");
}
var searchResult = await myRepo.SearchAsync(searchOptions);
return Ok(searchResult);
}
您的web api的客户端需要通过查询字符串中的搜索选项调用您的api,而不是在邮件正文中。
/ BASE_URL /客户?isActive =真anotherProperty = someValue中就这样。
希望有所帮助。
你应该遵循在可能的情况下将查询放在url中的做法,但是你还必须记住,api旨在让开发人员的生活更轻松。如果您的搜索条件很复杂,则可能无效。
我们有一个客户服务团队,他们希望在每个房产的范围和条件下公开实体的清洗版本,并且他们希望能够访问一些相关的房产。虽然我们本可以在URL中完成这项工作,但它会让我们的前端团队疯狂!因此,我们采用了POST到... / api / entity / queries的约定将用于这些复杂的搜索。
起初我反对使用像这样的POST,但它确实使整个过程变得更加简单。
除非你非常需要控制传入的查询表达式,否则我强烈考虑使用ASP.net ODATA接口http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api,尤其是http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options#examples。这显示了端点如何返回IQueryable,然后消费者可以使用ODATA语法进行查询。