我目前正在改进我们公司已使用多年的旧 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 中实现过滤/分页?
我没有在.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,但我可以通过浏览器轻松地向其抛出测试值来进行测试。