-
ResponseEntity
的优先级高于@ResponseBody
。在不是
ResponseEntity
的情况下才去检查有没有@ResponseBody
注解。如果响应类型是ResposeEntity
可以不写@ResponseBody注解,写了也没有关系。 -
ResponseEntity 是在 org.springframework.http.HttpEntity 的基础上添加了http status code(http状态码),用于RestTemplate以及@Controller的HandlerMethod。
它在Controller中或者用于服务端响应时,作用是和@ResponseStatus与@ResponseBody结合起来的功能一样的。用于RestTemplate时,它是接收服务端返回的http status code 和 reason的。
总结: 简单粗暴的讲 @ResponseBody
可以直接返回Json结果,
@ResponseEntity
不仅可以返回json结果,还可以定义返回的HttpHeaders
和HttpStatus
.
@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));
}