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 输出

      1. @Controller
      2. public class DemoController {
      3. @RequestMapping("/str1")
      4. public ResponseEntity<String> DemoController() {
      5. // 响应状态码为200
      6. return ResponseEntity.ok("调用成功");
      7. }
      8. @RequestMapping("/str2")
      9. public ResponseEntity<String> demo() {
      10. // 自定义响应头和响应体,响应状态码200
      11. return ResponseEntity.ok().header("Content-Type", "application/json;charset=utf-8").body("调用成功");
      12. }
      13. @GetMapping("/user")
      14. public ResponseEntity<UserDto> get(){
      15. // 返回JavaBean
      16. return ResponseEntity.ok(new UserDto().setUsername("李四").setAge(18));
      17. }
      18. }

      使用 curl 查看响应头:
      image.png

    新增 HttpMessageConverter:实现 WebMvcConfigurer 并覆写 extendMessageConverters 方法,能够在默认转换器的基础上新增转换器

    1. @Override
    2. public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    3. // 扩展消息转换器
    4. // 修改默认的消息转换器的编码为UTF-8
    5. StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
    6. // 设置字符串转换器的MediaType
    7. stringHttpMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
    8. // 设置字符编码
    9. stringHttpMessageConverter.setDefaultCharset(StandardCharsets.UTF_8);
    10. // 将消息转换器添加到消息转换器中
    11. converters.add(stringHttpMessageConverter);
    12. }

    2、自定义消息头:

    1. @GetMapping("/customHeader")
    2. ResponseEntity<String> customHeader() {
    3. HttpHeaders headers = new HttpHeaders();
    4. headers.add("Custom-Header", "foo");
    5. return new ResponseEntity<>(
    6. "Custom header set", headers, HttpStatus.OK);
    7. }
    8. @GetMapping("/customHeader")
    9. ResponseEntity<String> customHeader() {
    10. return ResponseEntity.ok()
    11. .header("Custom-Header", "foo")
    12. .body("Custom header set");
    13. }