怎麼用 Spring Data 在 RESTful API 中實現更好的分頁

介紹

本文將重點介紹如何使用 Spring MVC 和 Spring Data 在 RESTful API 中實現分頁。

REST 分頁的可發現性

在分頁範圍內,滿足 REST 的 HATEOAS 約束,意味著使 API 的客戶端能夠基於導航中的當前頁面發現下一頁和上一頁。 為此,我們將使用Link HTTP 響應頭,以及 “next”,“prev”,“first” 和 “last” 鏈接關係類型。

添加一個偵聽器,監聽器將檢查導航是否允許下一頁,上一頁,第一頁和最後一頁。它將相關的 URI 作為 “鏈接” 添加到 HTTP 響應頭中

怎麼用 Spring Data 在 RESTful API 中實現更好的分頁

接下來,我們將使用 StringJoiner 連接每個鏈接。我們將使用 uriBuilder 生成 uri。讓我們看看我們如何繼續鏈接到下一頁:

怎麼用 Spring Data 在 RESTful API 中實現更好的分頁

讓我們來看看 constructNextPageUri 方法的邏輯:

怎麼用 Spring Data 在 RESTful API 中實現更好的分頁

我們將對希望包含的其餘 uri 進行類似的處理。

最後,我們將輸出添加為響應頭:

怎麼用 Spring Data 在 RESTful API 中實現更好的分頁

測試分頁

代碼如下:

怎麼用 Spring Data 在 RESTful API 中實現更好的分頁

測試分頁的可發現性

測試的重點是當前頁面在導航中的位置,以及應該從每個位置發現的不同 uri:

怎麼用 Spring Data 在 RESTful API 中實現更好的分頁

使用 Spring Data 實現 REST 分頁

在 Spring Data 中,如果我們需要從完整的結果集中返回一些結果,則可以使用任何 Pageable 存儲庫方法,因為它將始終返回 Page。 將根據頁碼,頁面大小和排序方向返回結果。

Spring Data REST 自動識別 URL 參數,例如頁碼,頁面大小,排序等。

要使用任何存儲庫的分頁方法,我們需要擴展
PagingAndSortingRepository:

怎麼用 Spring Data 在 RESTful API 中實現更好的分頁

如果我們調用 localhost:8080/subjects Spring 會自動添加頁碼,頁面大小,排序參數:

怎麼用 Spring Data 在 RESTful API 中實現更好的分頁

默認情況下,頁面大小是20,但是我們可以通過調用類似於 localhost:8080/subject?page=10 這樣的東西來更改它。

如果我們想實現分頁到我們自己的自定義庫 API,我們需要傳遞一個額外的可分頁參數,並確保 API 返回一個 Page:

怎麼用 Spring Data 在 RESTful API 中實現更好的分頁

每當我們添加自定義API時,就會將 /search 端點添加到生成的鏈接中。因此,如果我們調用
localhost:8080/subjects/search,我們將看到一個分頁功能的端點:

怎麼用 Spring Data 在 RESTful API 中實現更好的分頁

所有實現
PagingAndSortingRepository 的 api 都將返回一個頁面。如果我們需要返回來自頁面的結果列表,頁面的 getContent() API 提供了作為 Spring Data REST API 的結果而獲取的記錄列表。

將 List 轉換為 Page

假設我們有一個可分頁的對象作為輸入,但是我們需要檢索的信息包含在一個 List 中,而不是一個
PagingAndSortingRepository。在這些情況下,我們可能需要將 List 轉換為 Page。

例如,假設我們有一個 SOAP 服務的結果列表:

怎麼用 Spring Data 在 RESTful API 中實現更好的分頁

我們需要在發送給我們的 Pageable 對象指定的特定位置訪問列表。那麼,讓我們定義開始索引:

怎麼用 Spring Data 在 RESTful API 中實現更好的分頁

結束索引:

怎麼用 Spring Data 在 RESTful API 中實現更好的分頁

有了這兩個地方,我們可以創建一個 Page 來獲取它們之間的元素列表:

怎麼用 Spring Data 在 RESTful API 中實現更好的分頁

這樣我們就可以返回 Page 作為一個有效的結果。

注意,如果我們還希望支持排序,我們需要在將 List 的子列表之前對其進行排序。

總結

本文演示瞭如何使用 Spring 在 REST API 中實現分頁,並討論瞭如何設置和測試可發現性。

感謝大家的觀看,歡迎關注我的頭條號。


分享到:


相關文章: