倉庫資源
基礎
Spring Data REST 的核心功能是為 Spring Data 儲存庫匯出資源。因此,要檢視並可能自定義匯出方式的核心構件是儲存庫介面。考慮以下儲存庫介面
public interface OrderRepository extends CrudRepository<Order, Long> { }
對於此儲存庫,Spring Data REST 在 /orders 處公開了一個集合資源。路徑是根據所管理域類的未大寫、複數形式的簡單類名派生的。它還在 URI 模板 /orders/{id} 下為儲存庫管理的每個專案公開了一個專案資源。
儲存庫方法公開
為某個儲存庫公開哪些 HTTP 資源主要由儲存庫的結構決定。換句話說,資源公開將遵循您在儲存庫上公開的方法。如果您擴充套件 CrudRepository,您通常會公開公開我們可以預設註冊的所有 HTTP 資源所需的所有方法。下面列出的每個資源都將定義需要存在哪些方法,以便為每個資源公開特定的 HTTP 方法。這意味著,不公開這些方法的儲存庫(透過根本不宣告它們或顯式使用 @RestResource(exported = false))將不會在這些資源上公開這些 HTTP 方法。
有關如何單獨調整預設方法公開或專用 HTTP 方法的詳細資訊,請參閱自定義支援的 HTTP 方法。
預設狀態碼
對於公開的資源,我們使用一組預設狀態碼
-
200 OK:用於純GET請求。 -
201 Created:用於建立新資源的POST和PUT請求。 -
204 No Content:對於PUT、PATCH和DELETE請求,當配置設定為不對資源更新返回響應體時 (RepositoryRestConfiguration.setReturnBodyOnUpdate(…))。如果配置值設定為包含PUT的響應,則更新返回200 OK,透過PUT建立的資源返回201 Created。
資源可發現性
HATEOAS 的核心原則是資源應該透過釋出指向可用資源的連結來發現。在 JSON 中表示連結有幾個相互競爭的事實標準。預設情況下,Spring Data REST 使用 HAL 來渲染響應。HAL 定義連結包含在返回文件的屬性中。
資源發現從應用程式的頂層開始。透過向部署 Spring Data REST 應用程式的根 URL 發出請求,客戶端可以從返回的 JSON 物件中提取一組連結,這些連結表示客戶端可用的下一級資源。
例如,要發現應用程式根目錄中有哪些資源可用,請向根 URL 發出 HTTP GET,如下所示
curl -v https://:8080/
< HTTP/1.1 200 OK
< Content-Type: application/hal+json
{ "_links" : {
"orders" : {
"href" : "https://:8080/orders"
},
"profile" : {
"href" : "https://:8080/api/alps"
}
}
}
結果文件的屬性是一個物件,它由表示關係型別的鍵組成,幷包含 HAL 中指定的巢狀連結物件。
有關 profile 連結的更多詳細資訊,請參閱應用級配置檔案語義 (ALPS)。 |
集合資源
Spring Data REST 公開了一個集合資源,其名稱取自匯出儲存庫處理的域類的未大寫、複數形式。資源名稱和路徑都可以透過在儲存庫介面上使用 @RepositoryRestResource 進行自定義。
支援的 HTTP 方法
集合資源支援 GET 和 POST。所有其他 HTTP 方法都會導致 405 Method Not Allowed。
GET
透過其 findAll(…) 方法返回儲存庫服務的所有實體。如果儲存庫是分頁儲存庫,我們會在必要時包含分頁連結和額外的頁面元資料。
引數
如果儲存庫具有分頁功能,則資源接受以下引數
-
page:要訪問的頁碼(0 索引,預設為 0)。 -
size:請求的頁面大小(預設為 20)。 -
sort:一系列排序指令,格式為($propertyname,)+[asc|desc]?。
POST
POST 方法從給定的請求體建立一個新實體。預設情況下,響應是否包含正文由請求傳送的 Accept 標頭控制。如果傳送了,則建立響應正文。如果沒有,則響應正文為空,並且可以透過遵循 Location 響應標頭中包含的連結來獲取建立的資源的表示。此行為可以透過相應配置 RepositoryRestConfiguration.setReturnBodyOnCreate(…) 來覆蓋。
專案資源
Spring Data REST 將單個集合專案作為集合資源的子資源公開。
支援的 HTTP 方法
專案資源通常支援 GET、PUT、PATCH 和 DELETE,除非顯式配置阻止(詳見“關聯資源”)。
GET
GET 方法返回單個實體。
自定義狀態碼
GET 方法只有一個自定義狀態碼
-
405 Method Not Allowed:如果findOne(…)方法未匯出(透過@RestResource(exported = false))或儲存庫中不存在。
相關資源
對於域型別的每個關聯,我們都會公開以關聯屬性命名的連結。您可以透過在屬性上使用 @RestResource 來自定義此行為。相關資源屬於關聯資源型別。
PUT
PUT 方法用提供的請求體替換目標資源的狀態。預設情況下,響應是否包含正文由請求傳送的 Accept 標頭控制。如果請求標頭存在,則返回響應正文和 200 OK 的狀態碼。如果不存在標頭,則響應正文為空,成功請求返回 204 No Content 的狀態。此行為可以透過相應配置 RepositoryRestConfiguration.setReturnBodyOnUpdate(…) 來覆蓋。
PATCH
PATCH 方法與 PUT 方法類似,但部分更新資源狀態。
自定義狀態碼
PATCH 方法只有一個自定義狀態碼
-
405 Method Not Allowed:如果save(…)方法未匯出(透過@RestResource(exported = false))或儲存庫中不存在。
關聯資源
搜尋資源
搜尋資源返回儲存庫公開的所有查詢方法的連結。查詢方法資源的路徑和名稱可以透過在方法宣告上使用 @RestResource 進行修改。
支援的 HTTP 方法
由於搜尋資源是隻讀資源,因此它僅支援 GET 方法。
GET
GET 方法返回指向各個查詢方法資源的連結列表。
相關資源
對於儲存庫中宣告的每個查詢方法,我們都會公開一個查詢方法資源。如果資源支援分頁,則指向它的 URI 是一個包含分頁引數的 URI 模板。