在 Web Api 2 中为链接标题添加分页

Posted

技术标签:

【中文标题】在 Web Api 2 中为链接标题添加分页【英文标题】:Adding Pagination to Link Headers in Web Api 2 【发布时间】:2014-11-22 17:02:08 【问题描述】:

目前在我的 Rest 服务中,我使用以下模型返回分页数据。

public class PagedResults<T>

    public List<LinkModel> Links  get; set; 
    public int TotalCount  get; set; 
    public double TotalPages  get; set; 
    public List<T> Results  get; set; 

这没问题,但我遇到了以下帖子。

http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#pagination

我的好奇心达到了顶峰,它提到使用 HTTP 标头返回链接和分页信息。尽管帖子提到了 RFC 5988,但我无法解开它的真正含义?是否每个都被实际采用为某种标准?

这里的问题是在 ASP.Net Web API 2 中,是否支持在链接头中添加分页信息?我使用智能感知来细读 HTTP 响应标头,但没有找到链接或类似的东西。

我找到了这篇文章,但它并没有真正回答我在 Web API 2 中的易用性问题。

Link headers vs link elements for RESTful JSON

【问题讨论】:

【参考方案1】:

您可以查看我的post here,它显示了如何将分页添加为“自定义”(X-Pagination)标题,下面是可能有帮助的示例代码:

 public IEnumerable<StudentBaseModel> Get(int page = 0, int pageSize = 10)

    IQueryable<Student> query;

    query = TheRepository.GetAllStudentsWithEnrollments().OrderBy(c => c.LastName);

    var totalCount = query.Count();
    var totalPages = (int)Math.Ceiling((double)totalCount / pageSize);

    var urlHelper = new UrlHelper(Request);
    var prevLink = page > 0 ? urlHelper.Link("Students", new  page = page - 1, pageSize = pageSize ) : "";
    var nextLink = page < totalPages - 1 ? urlHelper.Link("Students", new  page = page + 1, pageSize = pageSize ) : "";

    var paginationHeader = new
    
        TotalCount = totalCount,
        TotalPages = totalPages,
        PrevPageLink = prevLink,
        NextPageLink = nextLink
    ;

    System.Web.HttpContext.Current.Response.Headers.Add("X-Pagination",
    Newtonsoft.Json.JsonConvert.SerializeObject(paginationHeader));

    var results = query
    .Skip(pageSize * page)
    .Take(pageSize)
    .ToList()
    .Select(s => TheModelFactory.CreateSummary(s));

    return results;

【讨论】:

谢谢,这看起来像我所追求的。不过,为了我的澄清,X-Pagination 是标准标题,您在回答中说自定义标题吗?所以这还不是很常见的有自己的专用标头的东西吗? 没有它的自定义标头,任何以 X 开头的标头通常都不是标准的 HTTP 标头。 使用链接标题会更好吗? tools.ietf.org/html/rfc5988#page-6 @TaiseerJoudeh,您帖子的链接似乎已损坏。 @TaiseerJoudeh 我的工作一定会阻止该网站。我会在家里检查一下。谢谢!【参考方案2】:

在 .Net MVC 中添加链接头是微不足道的。根据IETF,它们用逗号分隔,所以:

HttpContext.Response.Headers.Add("Link", string.Join(",", pagedResult.Links));

注意:pagedResult 在您的 PagedResult&lt;T&gt; 类的实例中。

这可以与上面Taiseer的X-Pagination headers结合使用。

【讨论】:

以上是关于在 Web Api 2 中为链接标题添加分页的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel rest api 在 vue-tables-2 上添加分页?

如何使用 React 在 Fluent UI Detaillist 中添加分页

如何在 UICollectionView 中快速添加分页?

向 Reportlab Canvas 对象添加分页符

如何在面向协议的网络中添加分页页面

向我的mysql查询添加分页[重复]