![](/img/trans.png)
[英]Library function to generate URL from an ASP.Net Web API controller?
[英]How to generate HATEOAS links for paging in ASP.NET Core 6 Web API controller to return in Link header?
我需要为第一个、最后一个、下一个和上一个创建 HATEOAS 分页链接,并将它们添加到响应的Link
头中。
一个PagedResultDTO
从应用层返回给 API 层的控制器。 除了记录之外,它还包含有关TotalCount
、 PageNumber
、 PageSize
和PageCount
的信息。
我对框架提供的选项感到困惑。 许多帖子使用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));
}
然后我为每个链接更新pageNumber
和pageSize
。 如果之前未设置并使用默认值,则添加参数,例如:
query["pageNumber"] = "1";
query["pageSize"] = pageSize.ToString();
然后我使用LinkGenerator
创建链接:
linkGenerator.GetUriByAction(httpContext, values: query)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.