Web API 2:如何搜索

问题描述 投票:5回答:3

在ASP Web API 2中,我想在我的REST URI中实现搜索功能。

例如,如果我有资源客户

/base_url/customers
/base_url/customers/1
....

我想举例来说:

/base_url/customers?active=true

如何在Web API 2控制器中实现搜索? (我不想使用OData协议,因为我有DTO对象:我的控制器必须与DTO对象接口,而不是直接与模型对象接口)。

.net asp.net-mvc-4 asp.net-web-api asp.net-web-api2
3个回答
10
投票
  1. 使用您希望客户端搜索的所有属性定义搜索选项类。现在让我们称之为CustomerSearchOptions: public class CustomerSearchOptions { public bool IsActive { get; set; } public string AnotherProperty {get; set;} }
  2. 在api控制器上定义一个Get方法,该方法获取CustomerSearchOptions类型的参数,并使参数由[FromUri]属性修饰。
  3. get方法的实现将使用搜索选项搜索您的存储库并返回匹配的数据(MyCustomerDto): [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中

就这样。

希望有所帮助。


2
投票

你应该遵循在可能的情况下将查询放在url中的做法,但是你还必须记住,api旨在让开发人员的生活更轻松。如果您的搜索条件很复杂,则可能无效。

我们有一个客户服务团队,他们希望在每个房产的范围和条件下公开实体的清洗版本,并且他们希望能够访问一些相关的房产。虽然我们本可以在URL中完成这项工作,但它会让我们的前端团队疯狂!因此,我们采用了POST到... / api / entity / queries的约定将用于这些复杂的搜索。

起初我反对使用像这样的POST,但它确实使整个过程变得更加简单。


0
投票

除非你非常需要控制传入的查询表达式,否则我强烈考虑使用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语法进行查询。

© www.soinside.com 2019 - 2024. All rights reserved.