【问题标题】:Web API 2: how searchingWeb API 2:如何搜索
【发布时间】:2015-02-02 16:41:30
【问题描述】:

在 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


    【解决方案1】:

    您应该尽可能遵循将查询放在带有上述 url 的做法,但您还必须记住,api 旨在使开发人员的生活更轻松。如果您的搜索条件很复杂,这可能不起作用。

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

    起初我反对使用这样的 POST,但它确实让整个过程变得简单了很多。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 只是我尝试使用 ODATA 的经历是我做出的最糟糕的决定之一,也是最烦人的周末。当我回顾代码时,我不知道它是如何工作的。
      【解决方案3】:
      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);
            }
        
        1. 您的 Web api 的客户端需要调用您的 api,在查询字符串中而不是在消息正文中传递搜索选项。

        /base_url/customers?isActive=true&anotherProperty=somevalue

      就是这样。

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2018-11-06
        • 2016-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-07
        • 2017-08-24
        • 1970-01-01
        • 2018-03-30
        相关资源
        最近更新 更多