ResponseEntity
`ResponseEntity` 類似於 `@ResponseBody`,但具有狀態和標頭。例如
-
Java
-
Kotlin
@GetMapping("/something")
public ResponseEntity<String> handle() {
String body = ... ;
String etag = ... ;
return ResponseEntity.ok().eTag(etag).body(body);
}
@GetMapping("/something")
fun handle(): ResponseEntity<String> {
val body = ...
val etag = ...
return ResponseEntity.ok().eTag(etag).build(body)
}
主體通常會以值物件的形式提供,並由已註冊的 `HttpMessageConverters` 之一呈現為對應的回應表示形式 (例如 JSON)。
`ResponseEntity<Resource>` 可以針對檔案內容傳回,並將所提供資源的 `InputStream` 內容複製到回應 `OutputStream`。請注意,`InputStream` 應由 `Resource` 控制代碼延遲擷取,以便在複製到回應後可靠地關閉它。如果您為了此目的而使用 `InputStreamResource`,請務必使用隨需 `InputStreamSource` (例如,透過擷取實際 `InputStream` 的 Lambda 運算式) 建構它。此外,僅在結合自訂 `contentLength()` 實作的情況下才支援 `InputStreamResource` 的自訂子類別,這可避免為此目的而取用串流。
Spring MVC 支援使用單一值 Reactive 類型來非同步產生 `ResponseEntity`,以及/或針對主體使用單一值和多值 Reactive 類型。這允許以下類型的非同步回應
-
`ResponseEntity<Mono<T>>` 或 `ResponseEntity<Flux<T>>` 會立即得知回應狀態和標頭,而主體則在稍後以非同步方式提供。如果主體由 0..1 個值組成,請使用 `Mono`;如果它可以產生多個值,請使用 `Flux`。
-
`Mono<ResponseEntity<T>>` 會在稍後以非同步方式提供所有三個項目 — 回應狀態、標頭和主體。這允許回應狀態和標頭根據非同步請求處理的結果而有所不同。