如何在ASP.net Core中效率过滤RestApi的结果集
问题描述:
我目前正在修改我们公司多年来一直使用的旧API。我有一个特定端点调用GetBookings接受的参数的巨量:如何在ASP.net Core中效率过滤RestApi的结果集
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的参数给我的get bookings端点。该查询将包含我的过滤器,如'StartDate> = ... AND ....'。
这种方法看起来很复杂,因为我需要实际解析查询以转换为lambda表达式。我也可以使用短小精悍,但它会很容易受到SQL注入的影响。
4 /我发现的最后一个选项是实际创建接受必要参数的端点。
这很容易实现,但有点丑陋?!
如何在ASP.NET内核WebApi中实现过滤/分页?
谢谢 勒布
答
我没有在.NET核心试过,但我的WebAPI将创建一个“标准”或“参数”对象,它包含可以从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,但我可以通过浏览器非常容易地将测试值抛出来进行测试。
我试过了,它工作正常。不需要使用属性[FromUri]。 – Seb