如何在 Web API 查询字符串中将多个参数作为 OR 处理?
How do I handle multiple parameters as an OR in a Web API querystring?
假设我有这个 URL:
api.XXX.com/cities?risk=a,b&rating=x,y
我想要的是风险类别为 A 或 B 且评级为 X 或 Y 的城市列表。我应该如何实现?
我知道我可以获得风险和评级键的值,但是然后呢?最好是简单地解析字符串并使用 switch
语句吗?或者有更好的方法吗?
我建议创建一个 POCO 来表示此端点将接收的选项:
public class CitySearchOptions
{
public List<string> Risk { get; set; }
public List<string> Rating { get; set; }
}
然后您可以在控制器签名中使用 [FromUri]
属性,让查询字符串自动反序列化到您的 POCO 中。从那里您可以轻松地实现逻辑以对接收到的值采取行动。
public async Task<IHttpActionResult> SearchCities([FromUri] CitySearchOptions options)
请注意,上面是伪代码,如果不对查询字符串的格式进行一些调整,可能无法直接使用。 This question 建议对于基于列表的查询参数,您应该更喜欢这样的格式:
/cities?risk=a&risk=b&rating=x&rating=y
更标准的方法是:
api.XXX.com/cities?risks=a&risks=b&ratings=x&ratings=y
可以通过类似这样的控制器操作来处理:
[HttpGet]
public async Task<IHttpActionResult> SearchCities(
List<string> risks,
List<string> ratings)
{
var results = this.dbContext.Cities.AsQueryable();
if(risks.Any())
{
results = results.Where(c => c.Risks.Any(cr => risks.Contains(cr.Code));
}
if(ratings.Any())
{
results = results.Where(c => ratings.Contains(c.Rating));
}
...
}
相似的回答here。
假设我有这个 URL:
api.XXX.com/cities?risk=a,b&rating=x,y
我想要的是风险类别为 A 或 B 且评级为 X 或 Y 的城市列表。我应该如何实现?
我知道我可以获得风险和评级键的值,但是然后呢?最好是简单地解析字符串并使用 switch
语句吗?或者有更好的方法吗?
我建议创建一个 POCO 来表示此端点将接收的选项:
public class CitySearchOptions
{
public List<string> Risk { get; set; }
public List<string> Rating { get; set; }
}
然后您可以在控制器签名中使用 [FromUri]
属性,让查询字符串自动反序列化到您的 POCO 中。从那里您可以轻松地实现逻辑以对接收到的值采取行动。
public async Task<IHttpActionResult> SearchCities([FromUri] CitySearchOptions options)
请注意,上面是伪代码,如果不对查询字符串的格式进行一些调整,可能无法直接使用。 This question 建议对于基于列表的查询参数,您应该更喜欢这样的格式:
/cities?risk=a&risk=b&rating=x&rating=y
更标准的方法是:
api.XXX.com/cities?risks=a&risks=b&ratings=x&ratings=y
可以通过类似这样的控制器操作来处理:
[HttpGet]
public async Task<IHttpActionResult> SearchCities(
List<string> risks,
List<string> ratings)
{
var results = this.dbContext.Cities.AsQueryable();
if(risks.Any())
{
results = results.Where(c => c.Risks.Any(cr => risks.Contains(cr.Code));
}
if(ratings.Any())
{
results = results.Where(c => ratings.Contains(c.Rating));
}
...
}
相似的回答here。