最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中的REST分頁的實現(xiàn)代碼

 更新時間:2019年01月30日 11:48:51   作者:banq  
本文將介紹在REST API中實現(xiàn)分頁的基礎(chǔ)知識。我們將專注于使用Spring Boot和Spring Data 在Spring MVC中構(gòu)建REST分頁,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

本文將介紹在REST API中實現(xiàn)分頁的基礎(chǔ)知識。我們將專注于使用Spring Boot和Spring Data 在Spring MVC中構(gòu)建REST分頁。

分頁是一種處理大結(jié)果數(shù)據(jù)集的機制。在REST API中實現(xiàn)分頁并沒有什么不同,但需要一些額外的思考過程。為REST API提供流暢有效的分頁可以增加用戶體驗并有助于構(gòu)建高效,快速的REST API。我們使用Spring Boot作為示例。

1.資源與表示

在我們開始設(shè)計分頁API之前,我們需要清楚地了解頁面作為資源或資源的表示。我們需要記住許多基本要素

一個頁面Page不是REST中的一個資源,而是其請求的屬性。

以資源名稱Product為構(gòu)建分頁的例子,在高層次上我們確實有以下三個選項來構(gòu)建分頁。

  • 將產(chǎn)品Product作為資源并使用查詢字符串來處理分頁以及其他參數(shù),例如排序等(例如http://domainname/products?page=1)。
  • 第二個選項是將頁面Page用作資源和查詢字符串進(jìn)行排序。(例如http://domainname/products/page/1?sort_by=date)。
  • 使用頁面Page作為資源和URL部分進(jìn)行排序。(例如http://domainname/products/date/page/1)

考慮到上述問題,讓我們嘗試回答一些在設(shè)計REST API分頁時有用的問題。

  • 您是否將頁面Page視為頁面中產(chǎn)品的資源?

請記住,REST API不是圍繞任何預(yù)定義的規(guī)則或規(guī)范構(gòu)建的,所有上述三個選項都是有效的,并且基于上述問題的答案。如果我們將頁面視為資源,則選項3是有效選擇;但如果我們說頁面上的產(chǎn)品是資源,那么選項3不再有效(在第1,2頁上的產(chǎn)品可能會在將來更改),就個人而言,我會選擇選項1,因為對我來說,頁面 Page 不是  資源Resouce,它是請求的屬性。

2.可發(fā)現(xiàn)性

可發(fā)現(xiàn)性  有助于使  RESTful API  更加實用和優(yōu)雅。使REST API  可被發(fā)現(xiàn)經(jīng)常被忽視。以下是REST API可發(fā)現(xiàn)性的高級摘要 。

  • 有了這個功能,REST API在對客戶端的響應(yīng)中提供完整的URI意味著沒有客戶端需要“組合”URI。
  • 客戶端API獨立于URI結(jié)構(gòu)。
  • 通過以上2點,API更加靈活,允許開發(fā)人員在不破壞API的情況下更改URI架構(gòu)。(請記住,API提供所有URI,它們不是由客戶端API動態(tài)創(chuàng)建的)。

可發(fā)現(xiàn)性與REST API中的HATEOAS密切相關(guān)。REST API分頁可發(fā)現(xiàn)將通過"next","previous","first"和"last"鏈路作為響應(yīng)數(shù)據(jù)的一部分。我們正在考慮如何在分頁期間將此功能添加到您的API。

3.分頁設(shè)計考慮因素

在構(gòu)建REST API分頁界面時,讓我們快速介紹一些要點。

3.1 限制limit

限制允許API和客戶端控制結(jié)果集中請求的結(jié)果數(shù)。通過傳遞  limit 參數(shù),您可以指定每個頁面要返回的項目數(shù).API可以配置默認(rèn)限制,但應(yīng)允許客戶端指定限制。

http://hostname/products?page=1&limit=50

在上面的請求中,客戶端將限制設(shè)置為50.小心,同時允許客戶將limit 參數(shù)設(shè)置 , 設(shè)置為極高數(shù)量的限制會降低API性能。建議在API設(shè)計期間具有最大允許限制。

3.2 排序

排序總是與搜索和分頁并排。在設(shè)計REST API時,提供靈活性,讓客戶指定排序選項,同時從API返回結(jié)果。建議在設(shè)計API時使用  sort_by = [attribute  name] - [asc / desc]模式.API設(shè)計器應(yīng)將允許的屬性名稱指定為sort參數(shù)。例如,您可以使用?name-asc按產(chǎn)品名稱排序或?name-desc反向排序。

4. Maven依賴

我們在Spring中處理REST分頁時介紹了所有基本內(nèi)容。我們在這篇文章中使用了以下技術(shù)堆棧,但它可以在任何其他技術(shù)上實現(xiàn),前提是您在設(shè)計時遵循所有基本原則。

  • Spring Boot
  • JPA.
  • Spring Data REST

在本文中使用Spring Data REST的原因之一是Data REST API支持的開箱即用功能。

我們將在pom.xml中添加以下依賴項

  1. Spring Boot JPA
  2. Spring Boot Data REST
  3. HATEOS和Web
<dependencies>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-rest</artifactId>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-hateoas</artifactId>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
   <groupId>org.hsqldb</groupId>
   <artifactId>hsqldb</artifactId>
   <scope>runtime</scope>
  </dependency>
</dependencies>

4.1 REST控制器:

@RestController
public 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 + "\"";
 }
}

讓我們快速介紹上面代碼中的幾個要點。

  1. 我們使用  Pageable作為控制器的參數(shù)之一。這將有助于返回頁面而不是列表。
  2. Pageable具有所有必需的分頁信息。
  3. Pageable在Spring JPA中運行得非常好,并且透明地處理分頁。

4.2 Previous 和Next 鏈接

每個頁面響應(yīng)將返回鏈接到當(dāng)前頁面前面和后面的頁,這是基于使用IANA定義鏈接關(guān)系 prev 和  next。但是,如果您當(dāng)前位于結(jié)果的第一頁,則不會呈現(xiàn)任何 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
  }
}

讓我們深入了解響應(yīng)數(shù)據(jù)中的一些有趣事實

  • next 鏈接指向下一頁。last 鏈接指向的最后一個結(jié)果集。
  • self 鏈接提供整個系列。
  • 底部  page 提供有關(guān)分頁的信息,包括頁面大小,總結(jié)果,總頁數(shù)和當(dāng)前頁碼。

4.2使用鏈接頭

HTTP標(biāo)頭是REST API的關(guān)鍵方面.HTTP鏈接標(biāo)頭還可用于將分頁信息傳遞給客戶端。通過上述測試,系統(tǒng)將返回以下附加信息作為Link HTTP標(biāo)頭的一部分。

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.于提供給你的這些鏈接關(guān)系。不要試圖猜測或構(gòu)建自己的URL。Spring PagedResource提供所有這些信息作為結(jié)果的一部分,我們只需要確保從這些信息中構(gòu)建正確的HTTP頭。在我們的控制器示例中,我們在createLinkHeader方法中構(gòu)建標(biāo)頭。

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 + "\"";
}

總結(jié)

在這篇文章中,我們學(xué)習(xí)了如何在Spring和Spring Boot中實現(xiàn)  REST分頁。我們討論了如何構(gòu)建響應(yīng)以及在REST API響應(yīng)中使用鏈接HTTP標(biāo)頭的重要性。

所有這些示例和代碼片段的實現(xiàn)都可以在GitHub項目中找到

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring?boot+vue實現(xiàn)JSAPI微信支付的完整步驟

    spring?boot+vue實現(xiàn)JSAPI微信支付的完整步驟

    JSAPI支付是用戶在微信中打開商戶的H5頁面,商戶在H5頁面通過調(diào)用微信支付提供的JSAPI接口調(diào)起微信支付模塊完成支付,下面這篇文章主要給大家介紹了關(guān)于spring?boot+vue實現(xiàn)JSAPI微信支付的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Springboot 整合 Java DL4J 實現(xiàn)智能客服功能

    Springboot 整合 Java DL4J 實現(xiàn)智能客服功能

    本文主要介紹了如何使用SpringBoot整合JavaDeeplearning4j來構(gòu)建一個智能客服系統(tǒng),詳細(xì)探討了神經(jīng)網(wǎng)絡(luò)選擇、數(shù)據(jù)集格式、技術(shù)介紹、Maven依賴、代碼示例等內(nèi)容,為構(gòu)建高效、便捷、個性化的客戶服務(wù)提供了理論支持和實踐指導(dǎo)
    2024-10-10
  • SpringBoot讀取resource目錄下文件失敗的原因及解決方案

    SpringBoot讀取resource目錄下文件失敗的原因及解決方案

    在idea中運行時,有些resource下文件讀取工具類能夠正常獲取讀取到文件,但是通過java–jar的方式去運行jar包,此時resource下文件讀取工具類讀取文件就失效了,本文就給大家介紹一下SpringBoot讀取resource目錄下文件失敗解決方案,需要的朋友可以參考下
    2023-08-08
  • idea中不用git解除關(guān)聯(lián)的方式

    idea中不用git解除關(guān)聯(lián)的方式

    IntelliJ?IDEA是一款高效的Java編程環(huán)境,提供智能編碼輔助、J2EE、Ant等集成,支持本地和遠(yuǎn)程調(diào)試,本文講述了如何在IDEA中解除版本控制和刪除.git文件夾,幫助開發(fā)者更好地管理項目設(shè)置和提升開發(fā)效率
    2024-10-10
  • 詳解Maven optional關(guān)鍵字透徹圖解

    詳解Maven optional關(guān)鍵字透徹圖解

    這篇文章主要介紹了詳解Maven optional關(guān)鍵字透徹圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 詳解領(lǐng)域驅(qū)動設(shè)計之事件驅(qū)動與CQRS

    詳解領(lǐng)域驅(qū)動設(shè)計之事件驅(qū)動與CQRS

    這篇文章分析了如何應(yīng)用事件來分離軟件核心復(fù)雜度。探究CQRS為什么廣泛應(yīng)用于DDD項目中,以及如何落地實現(xiàn)CQRS框架。當(dāng)然我們也要警惕一些失敗的教訓(xùn),利弊分析以后再去抉擇正確的應(yīng)對之道
    2021-06-06
  • java 對象輸入輸出流讀寫文件的操作實例

    java 對象輸入輸出流讀寫文件的操作實例

    這篇文章主要介紹了java 對象輸入輸出流讀寫文件的操作實例的相關(guān)資料,這里使用實現(xiàn)Serializable接口,需要的朋友可以參考下
    2017-07-07
  • Java String類字符串的理解與認(rèn)知

    Java String類字符串的理解與認(rèn)知

    String字符串和char字符不同,char使用單引號,只能表示一個字符,字符串就是一段文本。String是個類。這個類使用final修飾,所以這個類是不可以繼承擴充和修改它的方法的
    2021-10-10
  • 關(guān)于Struts2的類型轉(zhuǎn)換詳解

    關(guān)于Struts2的類型轉(zhuǎn)換詳解

    本篇文章,小編將為大家介紹關(guān)于Struts2的類型轉(zhuǎn)換詳解,有需要的朋友可以參考一下
    2013-04-04
  • Java 其中翻轉(zhuǎn)字符串的實現(xiàn)方法

    Java 其中翻轉(zhuǎn)字符串的實現(xiàn)方法

    這篇文章主要介紹了Java 其中翻轉(zhuǎn)字符串的實現(xiàn)方法,需要的朋友可以參考下
    2014-02-02

最新評論

庆云县| 星座| 潜江市| 哈尔滨市| 巴里| 伽师县| 邢台市| 临夏市| 宣武区| 灌阳县| 漳平市| 都安| 贵港市| 彭泽县| 乡城县| 安庆市| 通海县| 信阳市| 临洮县| 云林县| 都昌县| 利川市| 汉寿县| 内江市| 同仁县| 固阳县| 曲沃县| 九龙城区| 周口市| 钟祥市| 石城县| 岳阳市| 镇平县| 华容县| 杨浦区| 苏尼特右旗| 漠河县| 丰镇市| 甘谷县| 烟台市| 江陵县|