目录
响应数据类型:
一、自动 JSON 响应
1 实现解析
@RestController
作用类注解,自动将方法返回值序列化为 JSON(无需
@ResponseBody
注解)。底层依赖
HttpMessageConverter
(如Jackson
库)。
emailUsers
对象封装创建 POJO 实例并填充属性,Spring 自动转换属性名为 JSON 字段(如
account → "account"
)。复杂属性(如
String[] hobby
)会被处理为 JSON 数组。
适用场景
快速构建 RESTful API,返回结构化数据(如查询用户信息)。
无需手动处理响应头或内容协商。
// 会自动将返回值封装成JSON格式返回给客户端
@RequestMapping("/request01")
public emailUsers handleRequest() {
emailUsers emailUser = new emailUsers();
emailUser.setAccount("zhangsan");
emailUser.setPw("123456");
emailUser.setGender("男");
emailUser.setHid("1");
emailUser.setPlace("北京");
emailUser.setOther("无");
emailUser.setHobby(new String[]{"打球", "看电影" });
System.out.println(emailUser);
return emailUser;
}
二、文件下载
1 核心实现
ResponseEntity<InputStreamResource>
封装响应实体,精确控制状态码、头部和正文。
InputStreamResource
将文件流包装为响应体,避免直接加载文件到内存。
关键配置
文件名编码:
URLEncoder.encode()
解决中文乱码。内容类型:
MediaType.APPLICATION_OCTET_STREAM
表示二进制流。内容长度:
contentLength()
声明文件大小(非必须,但利于浏览器进度显示)。下载头:
Content-Disposition
触发浏览器下载行为。
2 优化与问题
大文件处理
问题:
inputStream.readAllBytes()
会将文件全部读入内存,大文件易导致 OOM。解决:直接传递
InputStreamResource
流式返回,无需预读字节。
资源关闭问题
风险:
inputStream.close()
后仍返回InputStreamResource
,可能导致流关闭异常。建议:使用
try-with-resources
或确保流在响应结束后关闭(如通过FileSystemResource
自动管理)。
/**
* 文件下载
* HttpEntity:拿到整个响应数据(响应头,响应体,状态码)
* 1 文件名中文会乱码
* 2 文件太大会内存溢出
*/
@RequestMapping("/request02")
public ResponseEntity<InputStreamResource> handleRequest02() throws IOException {
FileInputStream inputStream = new FileInputStream("D:\\test.txt");
byte[] bytes = inputStream.readAllBytes();
//解决中文乱码
String encode = URLEncoder.encode("文本.txt", StandardCharsets.UTF_8);
//解决文件太大内存溢出
InputStreamResource resource = new InputStreamResource(inputStream);
inputStream.close();
return ResponseEntity.ok()
//文件类型
.contentType(MediaType.APPLICATION_OCTET_STREAM)
//内容大小
.contentLength(inputStream.available())
//内容处理方式
.header("Content-Disposition", "attachment;filename=" + encode)
.body(resource);
}