如何在 JSON:API 中定义的“过滤查询参数族”标准的 GET 请求中传递多个相关参数?

How to pass multiple related parameters in GET request for "filter query parameter family" standards defined in in JSON:API?

提问人:Tim Schmelter 提问时间:11/14/2023 最后编辑:Guru StronTim Schmelter 更新时间:11/15/2023 访问量:86

问:

我正在使用 ASP.NET Core 6.0,我需要创建一个 api 端点,该端点可以处理必须始终提供的两个修复参数和一个可选过滤器参数列表:

https://<host>/api/article/GetArticles?pageId=123&filterId=234&filter[category]=1,2&filter[author]=12&filter[year]=2023

如您所见,过滤器类型在括号中指定。这是应该使用的 JSON:API 中定义的过滤器标准。但是,需要如何定义控制器中的端点来支持它呢?

这行不通,当然(是):filternull

[HttpGet("GetArticles")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult<IContent>> GetArticles(
    int pageId, 
    int filterId, 
    string? filter = null)
{
    // TODO ...
    return Ok();
}
C# asp.net-core-6.0 json-api

评论


答:

4赞 Guru Stron 11/14/2023 #1

您可以使用字典进行此类映射 - :[FromQuery] Dictionary<string, string>? filter = null

[HttpGet("GetArticles")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult> GetArticles(
    int pageId,
    int filterId, 
    [FromQuery] Dictionary<string, string>? filter = null)
{
    // TODO ...
    return Ok();
}

评论

1赞 Tim Schmelter 11/14/2023
谢谢。这是一个很好的方法。我已经手动创建了一个字典,从中也可以使用,但不如这种方法优雅。当然,您仍然需要拆分这些值,因为它们可以包含每种类型的多个过滤器。但这是一件容易的事。Request.Query
2赞 T. Dominik 11/14/2023 #2

这是一个最小的工作示例。在 Postman 中使用此路径进行测试

/GetArticles?pageId=1&filterId=2&filter[category]=3&filter[author]=5

请注意,filter 是字典,因为我正在为 filter 属性发送键值对

[HttpGet("GetArticles")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult<IContent>> GetArticles(
    int pageId,
    int filterId, 
    [FromQuery] IDictionary<string, string>? filter)
{
    // TODO ...
    return Ok();
}

我想你现在可以想象你可以做的不止这些。

评论

1赞 Tim Schmelter 11/14/2023
谢谢,和 Guru 一样,所以我投了赞成票,但他:)快一点