如何使用 ASP.net 核心在 Rest Api 中高效过滤结果集
How to efficiency filter result set in a RestApi with ASP.net Core
我目前正在改造我们公司使用多年的旧 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,它似乎提供了一些高级 filtering/paging 选项。
It seems the OData Microsoft version is not up to date (or not maintained?)
2/ 我还可以在名为搜索 (HttpPost) 的预订下添加一个端点并接受 JSON 过滤器。
This approach is NOT really restful and causes some cache issues (as HttpPost requests are not cached).
3/ 我还可以将一个名为 query 的参数添加到我的 get bookings 端点。此查询将包含我的过滤器,如 'StartDate >= ... AND ....'。
This approach seems complicated to implement as I would need to actually parse the query to convert to a lambda expression. I could also use dapper but then it would be vulnerable to SQL Injection.
4/ 我发现的最后一个选项是实际创建一个接受必要参数的端点。
It's easy to implement but kind of ugly?!
您将如何在 ASP.NET 核心 WebApi 中实现 filtering/paging?
谢谢,
塞布
我没有在 .net 核心中尝试过这个,但是对于 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 调用该方法,您基本上会执行您之前所做的操作,但参数绑定将在您的参数对象中填充适当的值。
如果您想 POST 值到类似的功能,您也可以使用相同的对象。
我们将此方法用于搜索功能,该功能通常接受来自实际 API 调用者的 POST,但我可以通过浏览器非常轻松地向其提供测试值以进行测试。
我目前正在改造我们公司使用多年的旧 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,它似乎提供了一些高级 filtering/paging 选项。
It seems the OData Microsoft version is not up to date (or not maintained?)
2/ 我还可以在名为搜索 (HttpPost) 的预订下添加一个端点并接受 JSON 过滤器。
This approach is NOT really restful and causes some cache issues (as HttpPost requests are not cached).
3/ 我还可以将一个名为 query 的参数添加到我的 get bookings 端点。此查询将包含我的过滤器,如 'StartDate >= ... AND ....'。
This approach seems complicated to implement as I would need to actually parse the query to convert to a lambda expression. I could also use dapper but then it would be vulnerable to SQL Injection.
4/ 我发现的最后一个选项是实际创建一个接受必要参数的端点。
It's easy to implement but kind of ugly?!
您将如何在 ASP.NET 核心 WebApi 中实现 filtering/paging?
谢谢, 塞布
我没有在 .net 核心中尝试过这个,但是对于 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 调用该方法,您基本上会执行您之前所做的操作,但参数绑定将在您的参数对象中填充适当的值。
如果您想 POST 值到类似的功能,您也可以使用相同的对象。
我们将此方法用于搜索功能,该功能通常接受来自实际 API 调用者的 POST,但我可以通过浏览器非常轻松地向其提供测试值以进行测试。