繁体   English   中英

如何为 ASP.NET Core 6 Web API 控制器中的分页生成 HATEOAS 链接以在链接标头中返回?

[英]How to generate HATEOAS links for paging in ASP.NET Core 6 Web API controller to return in Link header?

我需要为第一个、最后一个、下一个和上一个创建 HATEOAS 分页链接,并将它们添加到响应的Link头中。

一个PagedResultDTO从应用层返回给 API 层的控制器。 除了记录之外,它还包含有关TotalCountPageNumberPageSizePageCount的信息。

我对框架提供的选项感到困惑。 许多帖子使用UriHelper ,但似乎LinkGenerator是较新的当前助手类。 查看文档,我不明白LinkGenerator提供的各种方法的区别。 有什么好的帖子可以解释各种方法的用例吗?

由于请求可以具有各种其他查询参数,例如用于排序、过滤、搜索、嵌入,因此需要在创建链接时保留并返回它们。 例如,控制器声明可能如下所示:

public ActionResult<PagedResultDTO<GetCountriesDTO>> GetCountries(
   [FromHeader(Name = "If-None-Match")] string? eTags, 
   [CommaSeparated] IEnumerable<string> languages, 
   string? sort, 
   string? search, 
   int? pageNumber, 
   int? pageSize)

[CommaSeperated]是一个扩展,它接受以逗号分隔的多个值并创建一个列表而无需重复查询参数。如果未设置 pageNumber 和 pageCount 并且在特定控制器方法中未设置默认值,我的用例处理程序将设置默认值。)

对于像这样的请求:

GET https://example.com/api/countries?languages=de-DE,en-US&sort=name

我需要生成:

<https://example.com/api/countries?languages=de-DE,en-US&sort=name&pageNumber=2&pageSize=20>; rel="next",
<https://example.com/api/countries?languages=de-DE,en-US&sort=name&pageNumber=1&pageSize=20>; rel="first",
<https://example.com/api/countries?languages=de-DE,en-US&sort=name&pageNumber=10&pageSize=20>; rel="last"

所有与分页无关的查询参数都需要保存在生成​​的链接中。 LinkGenerator是否支持直接生成这些分页链接的方法? 是否已经有任何结构支持Link标头格式? 我想知道是否应该使用Request对象手动创建链接?

我现在使用包含传递的查询参数的字典创建了自己的代码。

Dictionary<string, string> query = new();
foreach (KeyValuePair<string, StringValues> item in httpContext.Request.Query)
{
    query.Add(item.Key, string.Join(",", item.Value));
}

然后我为每个链接更新pageNumberpageSize 如果之前未设置并使用默认值,则添加参数,例如:

query["pageNumber"] = "1";
query["pageSize"] = pageSize.ToString();

然后我使用LinkGenerator创建链接:

linkGenerator.GetUriByAction(httpContext, values: query)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM