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)
}
body 通常会作为一个值对象提供,通过注册的 HttpMessageConverters
之一渲染为相应的响应表示(例如 JSON)。
ResponseEntity<Resource>
可以用于返回文件内容,将提供的资源的 InputStream
内容复制到响应的 OutputStream
中。请注意,InputStream
应该通过 Resource
句柄延迟获取,以便在将其复制到响应后可靠地关闭它。如果您为此目的使用 InputStreamResource
,请确保使用按需提供的 InputStreamSource
来构造它(例如,通过一个获取实际 InputStream
的 lambda 表达式)。此外,自定义的 InputStreamResource
子类仅在结合自定义 contentLength()
实现时受支持,这样可以避免为此目的消耗流。
Spring MVC 支持使用单一值的响应式类型来异步生成 ResponseEntity
,以及/或用于响应体的单一值和多值响应式类型。这使得以下类型的异步响应成为可能:
-
ResponseEntity<Mono<T>>
或ResponseEntity<Flux<T>>
可以立即确定响应的状态和头部信息,而响应体则在稍后异步提供。如果响应体包含 0 到 1 个值,使用Mono
;如果可以生成多个值,则使用Flux
。 -
Mono<ResponseEntity<T>>
在稍后的时间点异步提供所有三个部分——响应状态、头部信息和响应体。这使得响应状态和头部信息可以根据异步请求处理的结果而变化。