一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務(wù)器之家 - 編程語言 - Java教程 - Spring中的REST分頁的實現(xiàn)代碼

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

2021-07-13 15:44jdon Java教程

本文將介紹在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ù)集的機(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獨(dú)立于uri結(jié)構(gòu)。
  • 通過以上2點(diǎn),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分頁界面時,讓我們快速介紹一些要點(diǎn)。

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
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<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控制器:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@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 + "\"";
 }
}

讓我們快速介紹上面代碼中的幾個要點(diǎn)。

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

4.2 previous 和next 鏈接

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

我們來看下面的例子:

curl http://localhost:8080/products

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
  "_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)頭的一部分。

?
1
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)頭。

?
1
2
3
4
5
6
7
8
9
10
11
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í)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://www.jdon.com/51623

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产成人精品午夜在线播放 | 亚洲精品视频在线免费 | 24adc年龄18岁欢迎大驾光临 | 国产在线91 | 久久久久久免费高清电影 | 日本男男gayxxxxx免费 | 日本综合在线观看 | 男人躁女人p | 大ji吧快给我别停受不了视频 | 7777色鬼xxxx欧美色夫 | 亚洲a区视频| 日韩欧美中文字幕一区 | 国产精品制服丝袜白丝www | 成人免费观看网欧美片 | 国产盗摄女厕美女嘘嘘 | 国产成人理在线观看视频 | 四虎在线最新永久免费 | 草莓视频旧版本 | 9999热视频 | 亚洲 欧美 国产 综合首页 | 久久国产精品福利影集 | 美女用手扒自己下部 | 久久热在线视频精品1 | 欧美人与物videos另类3d | 四虎1515h永久 | 国产在线激情视频 | vod国产成人精品视频 | 深夜国产在线 | 欧美老骚 | 午夜久久久久久亚洲国产精品 | 波多野结衣一区 | 脱jk裙的美女露小内内无遮挡 | 国模孕妇季玥337p人体 | pron在线观看 | 动漫a级片 | 免费一区二区 | 国产精品第 | 女人肮脏的交易中文字幕未删减版 | 欧美性一区二区三区 | 欧美精品久久久久久久免费观看 | 日本午夜视频 |