Как сгенерировать ссылки HATEOAS для пейджинга в контроллере веб-API ASP.NET Core 6 для возврата в заголовке ссылки?
Мне нужно создать ссылки на страницы HATEOAS для первого, последнего, следующего и предыдущего и добавить их в заголовок ответа.
АPagedResultDTO
возвращается с прикладного уровня контроллеру на уровне API. Помимо записей, он содержит информацию оTotalCount
,PageNumber
,PageSize
, иPageCount
.
Меня смущают параметры, предоставляемые фреймворком. Многие посты используютUriHelper
, но кажется, что это более новый и текущий вспомогательный класс. Глядя на документацию, я не понимаю разницы между различными методами, которые обеспечивают. Есть ли хороший пост, в котором объясняются варианты использования различных методов?
Поскольку запрос может иметь различные другие параметры запроса, например, для сортировки, фильтрации, поиска, встраивания, их необходимо сохранить и вернуть при создании ссылок. Например, объявление контроллера может выглядеть так:
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
объект?
1 ответ
Теперь я создал свой собственный код, используя словарь, содержащий переданные параметры запроса.
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)