网络接口返回类ResponseEntity
简介
使用的org.springframework.http.ResponseEntity;
,是 Spring Framework 提供的、一个Spring中的通用类。它用于构建 HTTP 响应的方式、返回一个 HTTP 状态码为 200 OK 的响应,并且可以附带返回的数据。
待补入此博客。
方法
ResponseEntity 用于表示整个 HTTP 响应,包括:
- 状态码 (HTTP status code)
- 头部信息 (HTTP headers)
- 响应体 (HTTP body)
方法返回值的类型ResponseEntity<中的类型>
取决于接口返回值body(中的类型),因为public abstract <T> ResponseEntity<T> body( @Nullable T body )
。
获取工厂方法
ResponseEntity.ok()返回BodyBuilder
ResponseEntity.ok()
是一个静态工厂方法、用于返回一个 ResponseEntity. BodyBuilder
来生成具体的请求成功返回信息,使用该 ResponseEntity. BodyBuilder
生成的都是状态码为 200 OK、请求成功的响应。
返回文字信息
return ResponseEntity.ok("Operation successful.");
该接口响应的返回信息,如下图所示。
返回类对象(Spring自动转换为json格式)
如果返回的对象是User类,Spring会自动将其转换为JSON格式(前提是项目中有Jackson或类似的库支持)。
return ResponseEntity.ok(new FileRecord("filename","path",new Date()));
请求该接口收到的返回信息,如下图所示。
返回空内容
返回一个HTTP 200响应,但没有响应体。
//因为ResponseEntity.ok()返回的是 ResponseEntity.BodyBuilder,所以相当于BodyBuilder.build();
return ResponseEntity.ok().build();
请求该接口收到的返回信息(为空、下图的1
为postman的行数标记而非接口返回信息),如下图所示。
ResponseEntity.notFound()返回HeadersBuilder
ResponseEntity.notFound()
自认也是一个静态工厂方法、用于返回一个 ResponseEntity. HeadersBuilder<?>
来生成具体的404 notFound
返回信息,使用该 ResponseEntity. BodyBuilder
生成的都是状态码为 404 notFound
、请求资源未找到“Requested resource could not be found. 的响应。
返回文字信息
return ResponseEntity.notFound().build();
该接口响应的返回信息,如下图所示。
status(HttpStatus)返回BodyBuilder
ResponseEntity.status(HttpStatus)
自认也是一个静态工厂方法、用于返回一个ResponseEntity. BodyBuilder
来生成具体的HttpStatus
类返回信息,使用该 ResponseEntity. BodyBuilder
生成的都是状态码为指定HttpStatus
的响应。
本例中,返回类型ResponseEntity<中的类型>
取决于接口返回值body(中的类型),因为public abstract <T> ResponseEntity<T> body( @Nullable T body )
public ResponseEntity<String> downloadFile(@PathVariable String filename) {
// 返回 404 和错误消息
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body("User not found.");
该接口响应的返回信息,如下图所示。
noContent()返回HeadersBuilder
ResponseEntity.noContent()
自认也是一个静态工厂方法、用于返回一个ResponseEntity. HeadersBuilder
来通过status(HttpStatus.NO_CONTENT)
生成类返回信息,使用该 ResponseEntity. HeadersBuilder
生成的都是状态码为HTTP 204 No Content
的响应。
本例中,返回类型ResponseEntity<中的类型>
取决于接口返回值body(中的类型),因为public abstract <T> ResponseEntity<T> body( @Nullable T body )
return ResponseEntity.noContent().build();
设置响应头信息中的指定属性和值
比如设置content-type使用HttpHeaders.CONTENT_TYPE
:
return ResponseEntity.ok().header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).build();
请求该接口收到的返回信息,下图红框中的内容是上面设置的响应头信息,如下图所示。
如果修改上述代码
return ResponseEntity.ok().header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_GRAPHQL_VALUE).build();
请求该接口收到的返回信息,此时下图响应头信息发生了变化,如下图红框所示。
headers(headers)
由…调用,返回``。自定义响应头 如果需要自定义响应头,可以链式调用 header() 方法:
HttpHeaders headers = new HttpHeaders();
//下载文件所需
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFileName + "\"");
//
return ResponseEntity.ok().headers(headers).body(resource);
body(resource)
由ResponseEntity. BodyBuilder
调用,返回 ResponseEntity<T>
HttpHeaders headers = new HttpHeaders();
FileSystemResource resource = new FileSystemResource(file);
return ResponseEntity.ok().headers(headers).body(resource);
使用示例
@GetMapping("/download/{filename:.+}")
public ResponseEntity<FileSystemResource> downloadFile(@PathVariable String filename) {
// 假设文件存储在项目的files目录下
File file = new File("files/" + filename);
if (!file.exists()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
}
FileSystemResource resource = new FileSystemResource(file);
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + file.getName());
return ResponseEntity.ok()
.headers(headers)
.body(resource);
}