时间:2021-05-20
本文将介绍在REST API中实现分页的基础知识。我们将专注于使用Spring Boot和Spring Data 在Spring MVC中构建REST分页。
分页是一种处理大结果数据集的机制。在REST API中实现分页并没有什么不同,但需要一些额外的思考过程。为REST API提供流畅有效的分页可以增加用户体验并有助于构建高效,快速的REST API。我们使用Spring Boot作为示例。
1.资源与表示
在我们开始设计分页API之前,我们需要清楚地了解页面作为资源或资源的表示。我们需要记住许多基本要素
一个页面Page不是REST中的一个资源,而是其请求的属性。
以资源名称Product为构建分页的例子,在高层次上我们确实有以下三个选项来构建分页。
考虑到上述问题,让我们尝试回答一些在设计REST API分页时有用的问题。
请记住,REST API不是围绕任何预定义的规则或规范构建的,所有上述三个选项都是有效的,并且基于上述问题的答案。如果我们将页面视为资源,则选项3是有效选择;但如果我们说页面上的产品是资源,那么选项3不再有效(在第1,2页上的产品可能会在将来更改),就个人而言,我会选择选项1,因为对我来说,页面 Page 不是 资源Resouce,它是请求的属性。
2.可发现性
可发现性 有助于使 RESTful API 更加实用和优雅。使REST API 可被发现经常被忽视。以下是REST API可发现性的高级摘要 。
可发现性与REST API中的HATEOAS密切相关。REST API分页可发现将通过"next","previous","first"和"last"链路作为响应数据的一部分。我们正在考虑如何在分页期间将此功能添加到您的API。
3.分页设计考虑因素
在构建REST API分页界面时,让我们快速介绍一些要点。
3.1 限制limit
限制允许API和客户端控制结果集中请求的结果数。通过传递 limit 参数,您可以指定每个页面要返回的项目数.API可以配置默认限制,但应允许客户端指定限制。
http://hostname/products?page=1&limit=50
在上面的请求中,客户端将限制设置为50.小心,同时允许客户将limit 参数设置 , 设置为极高数量的限制会降低API性能。建议在API设计期间具有最大允许限制。
3.2 排序
排序总是与搜索和分页并排。在设计REST API时,提供灵活性,让客户指定排序选项,同时从API返回结果。建议在设计API时使用 sort_by = [attribute name] - [asc / desc]模式.API设计器应将允许的属性名称指定为sort参数。例如,您可以使用?name-asc按产品名称排序或?name-desc反向排序。
4. Maven依赖
我们在Spring中处理REST分页时介绍了所有基本内容。我们在这篇文章中使用了以下技术堆栈,但它可以在任何其他技术上实现,前提是您在设计时遵循所有基本原则。
在本文中使用Spring Data REST的原因之一是Data REST API支持的开箱即用功能。
我们将在pom.xml中添加以下依赖项
4.1 REST控制器:
@RestControllerpublic class ProductRESTController { @Autowired private ProductService productService; @Autowired private EntityLinks links; @GetMapping(value = "/products", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity < PagedResources < ProductEntity >> AllProducts(Pageable pageable, PagedResourcesAssembler assembler) { Page < ProductEntity > products = productService.findAllProducts(pageable); PagedResources < ProductEntity > pr = assembler.toResource(products, linkTo(ProductRESTController.class).slash("/products").withSelfRel()); HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.add("Link", createLinkHeader(pr)); return new ResponseEntity < > (assembler.toResource(products, linkTo(ProductRESTController.class).slash("/products").withSelfRel()), responseHeaders, HttpStatus.OK); } private String createLinkHeader(PagedResources < ProductEntity > pr) { final StringBuilder linkHeader = new StringBuilder(); linkHeader.append(buildLinkHeader(pr.getLinks("first").get(0).getHref(), "first")); linkHeader.append(", "); linkHeader.append(buildLinkHeader(pr.getLinks("next").get(0).getHref(), "next")); return linkHeader.toString(); } public static String buildLinkHeader(final String uri, final String rel) { return "<" + uri + ">; rel=\"" + rel + "\""; }}让我们快速介绍上面代码中的几个要点。
4.2 Previous 和Next 链接
每个页面响应将返回链接到当前页面前面和后面的页,这是基于使用IANA定义链接关系 prev 和 next。但是,如果您当前位于结果的第一页,则不会呈现任何 prev链接。
我们来看下面的例子:
curl http://localhost:8080/products
{ "_embedded": { "productEntities": [ ...data... ] }, "_links": { "first": { "href": "http://localhost:8080/products?page=0&size=20" }, "self": { "href": "http://localhost:8080/products" }, "next": { "href": "http://localhost:8080/products?page=1&size=20" }, "last": { "href": "http://localhost:8080/products?page=4&size=20" } }, "page": { "size": 20, "totalElements": 100, "totalPages": 5, "number": 0 }}让我们深入了解响应数据中的一些有趣事实
4.2使用链接头
HTTP标头是REST API的关键方面.HTTP链接标头还可用于将分页信息传递给客户端。通过上述测试,系统将返回以下附加信息作为Link HTTP标头的一部分。
Link →<http://localhost:8080/products?page=0&size=20>; rel="first", <http://localhost:8080/products?page=1&size=20>; rel="next"rel="next" 意思是下一页是 page=2;rel="first" 意思是第一页总是依赖page=2.于提供给你的这些链接关系。不要试图猜测或构建自己的URL。Spring PagedResource提供所有这些信息作为结果的一部分,我们只需要确保从这些信息中构建正确的HTTP头。在我们的控制器示例中,我们在createLinkHeader方法中构建标头。
private String createLinkHeader(PagedResources < ProductEntity > pr) { final StringBuilder linkHeader = new StringBuilder(); linkHeader.append(buildLinkHeader(pr.getLinks("first").get(0).getHref(), "first")); linkHeader.append(", "); linkHeader.append(buildLinkHeader(pr.getLinks("next").get(0).getHref(), "next")); return linkHeader.toString();}public static String buildLinkHeader(final String uri, final String rel) { return "<" + uri + ">; rel=\"" + rel + "\"";}总结
在这篇文章中,我们学习了如何在Spring和Spring Boot中实现 REST分页。我们讨论了如何构建响应以及在REST API响应中使用链接HTTP标头的重要性。
所有这些示例和代码片段的实现都可以在GitHub项目中找到
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了JQuery的Pager分页器的具体实现代码,供大家参考,具体内容如下效果图:代码:html代码:分页器functiondoChangePa
PHP+AJAX无刷新分页实现代码详解,最近在看ajax教程,就想写个简单入门的PHP+AJAX无刷新分页,我们依据ajax开发框架,代码如下:varhttp_
本文介绍了laravel手动创建数组分页的实现代码,分享给大家,具体如下:laravel分页功能:有几种方法可以对数据进行分页。最简单的是在[查询语句构造器]或
首先看下实现效果图,如果觉得还不错,请参考实现代码。上面数据下面分页使用方法1导入bootstrap的css2导入jquery3导入表格分页插件lTable.j
本文实例为大家分享了数据分页显示功能的PHP实现代码,供大家参考,具体内容如下实现代码:用户列表以上就是本文的全部内容,希望能给大家一个参考,也希望大家多多支持