ResponseEntity与注解@ResponseBody

2,125 阅读1分钟
  1. ResponseEntity的优先级高于@ResponseBody

    在不是ResponseEntity的情况下才去检查有没有@ResponseBody注解。如果响应类型是ResposeEntity可以不写@ResponseBody注解,写了也没有关系。

  2. ResponseEntity 是在 org.springframework.http.HttpEntity 的基础上添加了http status code(http状态码),用于RestTemplate以及@Controller的HandlerMethod。

    它在Controller中或者用于服务端响应时,作用是和@ResponseStatus与@ResponseBody结合起来的功能一样的。用于RestTemplate时,它是接收服务端返回的http status code 和 reason的。

总结: 简单粗暴的讲 @ResponseBody可以直接返回Json结果, @ResponseEntity不仅可以返回json结果,还可以定义返回的HttpHeadersHttpStatus.

    @SneakyThrows
    @RequestMapping("/redirect")
    public Object redirect(@RequestParam("code") String code,
                         HttpServletRequest servletRequest,
                         HttpServletResponse servletResponse) {
        Response token = getToken(code);
        String body = token.body().string();
        String[] split = body.split("&");

        OkHttpClient client = new OkHttpClient().newBuilder()
                .build();
        Request request = new Request.Builder()
                .url("https://api.github.com/user")
                .method("GET", null)
                .addHeader("Authorization", "Bearer " + split[0].split("=")[1])
                .build();
        Response response = client.newCall(request).execute();
        String userInfo = response.body().string();
        JSONObject jsonObject = JSON.parseObject(userInfo);
        String login = jsonObject.getString("login");
        // 设置cookie
        Cookie cookie = new Cookie("userInfo", login);
        cookie.setDomain("localhost");
        cookie.setHttpOnly(false);
        cookie.setMaxAge(10000);
        cookie.setPath("/");
        servletResponse.addCookie(cookie);

        MultiValueMap<String, String> headers = new HttpHeaders();
        // 重定向至localhost
        headers.set("Location", new URI("http://localhost:8080").toASCIIString());
        return new ResponseEntity("success", headers, HttpStatus.valueOf(302));
    }