簡體   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