- Web 开发技术:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Disposition
- SpringMVC官方文档:https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-responsebody
ResponseEntity、@ResponseBody、@ResponseStatus 总结:
- ResponseEntity:指定完整响应(包括HTTP标头和正文)的返回值将通过
HttpMessageConverter实现进行转换,并写入响应中- ResponseEntity 优先级高于 @ResponseBody,只有在返回值不是 ResponseEntity 的时候才会去检查有没有 @ResponseBody 注解,即响应类型是 ResponseEntity 时可以不写 @ResponseBody 注解,写了也不影响
- ResponseEntity 是在 org.springframework.http.HttpEntity 的基础上添加了 httpStatus 和用于 RestTemplate 以及 @Controller 的 HandlerMethod,在作为控制器的响应时,等效于 @ResponseStatus + @ResponseBody 注解
- @ResponseBody:返回值通过
HttpMessageConverter实现进行转换并写入响应 - @ResponseStatus:返回响应的状态码
1、ResponseEntity
- String 类型:调用 StringHttpMessageConverter 消息转换器,默认编码 ISO-8859-1,默认响应类型 text/plain
javaBean 类型:调用 MappingJackson2HttpMessageConverter 消息转换器,转换成 json 输出
@Controllerpublic class DemoController {@RequestMapping("/str1")public ResponseEntity<String> DemoController() {// 响应状态码为200return ResponseEntity.ok("调用成功");}@RequestMapping("/str2")public ResponseEntity<String> demo() {// 自定义响应头和响应体,响应状态码200return ResponseEntity.ok().header("Content-Type", "application/json;charset=utf-8").body("调用成功");}@GetMapping("/user")public ResponseEntity<UserDto> get(){// 返回JavaBeanreturn ResponseEntity.ok(new UserDto().setUsername("李四").setAge(18));}}
使用 curl 查看响应头:

新增 HttpMessageConverter:实现 WebMvcConfigurer 并覆写 extendMessageConverters 方法,能够在默认转换器的基础上新增转换器
@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {// 扩展消息转换器// 修改默认的消息转换器的编码为UTF-8StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();// 设置字符串转换器的MediaTypestringHttpMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));// 设置字符编码stringHttpMessageConverter.setDefaultCharset(StandardCharsets.UTF_8);// 将消息转换器添加到消息转换器中converters.add(stringHttpMessageConverter);}
2、自定义消息头:
@GetMapping("/customHeader")ResponseEntity<String> customHeader() {HttpHeaders headers = new HttpHeaders();headers.add("Custom-Header", "foo");return new ResponseEntity<>("Custom header set", headers, HttpStatus.OK);}@GetMapping("/customHeader")ResponseEntity<String> customHeader() {return ResponseEntity.ok().header("Custom-Header", "foo").body("Custom header set");}
