Как сгенерировать ссылки 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)
Другие вопросы по тегам