如何使用 ASP.net Core 高效过滤 RestApi 中的结果集

问题描述 投票:0回答:1

我目前正在改进我们公司已使用多年的旧 API。我有一个特定的端点调用 GetBookings 接受大量参数:

public HttpResponseMessage GetBookings(string contactId, string timeFilter = "upcoming", string bookedBy = null, string resourceTypeIds = null, string clientId = null (...), int pageSize = 25, int pageIndex = 0)
{
   (...)
}

添加所有这些参数感觉不自然,我正在寻找一种替代方法来完成此类事情。

1/我研究了 OData,它似乎提供了一些高级过滤/分页选项。

OData Microsoft 版本似乎不是最新的(或未维护?)

2/ 我还可以在预订下添加一个名为搜索 (HttpPost) 的端点并接受 JSON 过滤器。

这种方法并不是真正的安静,并且会导致一些缓存问题(因为 HttpPost 请求没有被缓存)。

3/ 我还可以向我的获取预订端点添加一个名为 query 的参数。该查询将包含我的过滤器,例如“StartDate >=... AND ....”。

这种方法似乎实现起来很复杂,因为我需要实际解析查询以转换为 lambda 表达式。我也可以使用 dapper,但它很容易受到 SQL 注入攻击。

4/我发现的最后一个选项是实际创建一个接受必要参数的端点。

很容易实现,但有点难看?!

如何在 ASP.NET core WebApi 中实现过滤/分页?

asp.net-web-api pagination filtering
1个回答
2
投票

我没有在.net core中尝试过这个,但是对于webapi我会创建一个“criteria”或“parameters”对象,其中包含可以从URL设置的属性。

例如

public class BookingSearchParameters
{
    public string contactId { get; set; }

    public string timeFilter { get; set; }

    etc..
}

然后我会让该方法将该对象作为参数。

[HttpGet()]
public HttpResponseMessage GetBookings([FromUri] BookingSearchParameters params)
{
    ... do stuff ...
}

对于调用该方法的 URL,您基本上会执行之前所做的操作,但参数绑定将在参数对象内填充适当的值。

如果您想将值发布到类似的函数,也可以使用相同的对象。

我们将此方法用于搜索功能,该功能通常接受来自实际 API 调用者的 POST,但我可以通过浏览器轻松地向其抛出测试值来进行测试。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.