- 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 输出
@Controller
public class DemoController {
@RequestMapping("/str1")
public ResponseEntity<String> DemoController() {
// 响应状态码为200
return ResponseEntity.ok("调用成功");
}
@RequestMapping("/str2")
public ResponseEntity<String> demo() {
// 自定义响应头和响应体,响应状态码200
return ResponseEntity.ok().header("Content-Type", "application/json;charset=utf-8").body("调用成功");
}
@GetMapping("/user")
public ResponseEntity<UserDto> get(){
// 返回JavaBean
return ResponseEntity.ok(new UserDto().setUsername("李四").setAge(18));
}
}
使用 curl 查看响应头:
新增 HttpMessageConverter:实现 WebMvcConfigurer 并覆写 extendMessageConverters 方法,能够在默认转换器的基础上新增转换器
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
// 扩展消息转换器
// 修改默认的消息转换器的编码为UTF-8
StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
// 设置字符串转换器的MediaType
stringHttpMessageConverter.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");
}