参考资料
ResponseEntity
用来标识整个Http响应,可以标识状态码,Head头部信息,以及响应体。
ResponseEntity
的优先级高于@ResponseBody。
在返回值不是ResponseEntity的情况下才去检查有没有@ResponseBody注解。
如果响应类型是ResponseEntity可以不写@ResponseBody注解,便可返回JSON数据或其他类型的数据,如果同时使用ResponseEntity和@ResponseBody注解也不会报错。
ResponseEntity是在 org.springframework.http.HttpEntity
的基础上添加了http status code
(http状态码)。作用是和@ResponseStatus
与@ResponseBody
结合起来的功能一样的。
@ResponseBody可以直接返回JSON结果, @ResponseEntity不仅可以返回JSON结果,还可以返回自定义的HttpHeaders和HttpStatus。
HttpServletResponse
中写入OutputStream和header的效果相同new ResponseEntity<>(响应体, 响应头, 状态码)
是非简写方式ResponseEntity.ok().headers(响应头).body(响应体)
是简写方式import org.springframework.core.io.ClassPathResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@GetMapping("/testResponseEntity1")
public ResponseEntity<byte[]> testResponseEntity1() throws Exception {
// 读取本地的文件
String filePath = "/temp/A110120119/测试文件.text";
ClassPathResource readFile = new ClassPathResource(filePath);
// 设置响应头,把文件名称放入响应头中,确保文件可下载
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Disposition", "attachment;filename=" + URLEncoder.encode(readFile.getFilename(), "UTF-8"));
// 设置内容类型为「application/octet-stream」二进制流
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
// 获取File对象
File file = readFile.getFile();
Path path = Paths.get(file.toURI());
// 获取File对象的字节码文件
byte[] bytes = Files.readAllBytes(path);
/*
* 表示返回一个字节码类型的响应
* 同时设置了响应头和状态码
* */
if (ObjectUtils.isEmpty(readFile.getFilename())) {
// 简写形式
return ResponseEntity.ok().headers(headers).body(bytes);
}
// 非简写形式
return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
}
@GetMapping("/testResponseEntity2")
public ResponseEntity<List<String>> testResponseEntity2() {
List<String> list = Arrays.asList("1", "2");
return ResponseEntity.ok(list);
}
@GetMapping("/testResponseEntity2")
@ResponseBody
public List<String> testResponseEntity2() {
List<String> list = Arrays.asList("1", "2");
return list;
}
HttpStatus.NO_CONTENT
状态码为204,表示服务器成功的处理了请求,但是没有返回任何内容import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@GetMapping("/testResponseEntity3")
public ResponseEntity<Void> testResponseEntity3(String param) {
// ⏹http状态码 204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
if (ObjectUtils.isEmpty(param)) {
// ⏹简写方式
return ResponseEntity.noContent().build();
}
// ⏹非简写方式
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
HttpStatus.CREATED
的201状态码表示请求成功并且服务器创建了新的资源。@GetMapping("/testResponseEntity4")
public ResponseEntity<Void> testResponseEntity4() {
// 向数据库中插入数据
// ......
// ⏹http状态码 201 (已创建) 请求成功并且服务器创建了新的资源。
return ResponseEntity.status(HttpStatus.CREATED).build();
}
@GetMapping("/testResponseEntity5")
public ResponseEntity<String> testResponseEntity5(String param) {
// 如果参数不存在就返回默认的图片url,并返回状态码201
if (!ObjectUtils.isEmpty(param)) {
return new ResponseEntity<>("默认的图片URL", HttpStatus.CREATED);
}
// 向数据库中插入图片,并返回能访问图片地址的url
// ......
// ⏹用于插入数据成功之后返回数据给前台
// ⏹201 状态码,并返回图片的url
return ResponseEntity.status(HttpStatus.CREATED).body("图片的url");
}
HttpStatus.BAD_REQUEST
表示状态码400,异常的请求。@GetMapping("/testResponseEntity6")
public ResponseEntity<Map<String, Object>> testResponseEntity6(String param) {
// 用来存放校验信息的Map
Map<String, Object> map = new HashMap<>();
// 进行参数校验
if (param == null) {
// 参数为null,直接返回错误码400
return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
} else if ("".equals(param.trim())){
// 参数为空字符串,返回错误码400的同时,还返回错误信息
map.put("errorMsg","参数为空");
return ResponseEntity.badRequest().body(map);
}
// 200 状态码,并指定请求成功的响应体
map.put("successMsg", "参数通过校验");
return ResponseEntity.status(HttpStatus.OK).body(map);
// 这种写法更加简单,本质上和上面是一种写法
// return ResponseEntity.ok(map);
}
$.ajax({
url: `请求URL`,
type: '请求方式',
// data: JSON.stringify(param),
// 向服务器发送的数据类型
// contentType: 'application/json;charset=utf-8',
// dataType: 'json',
success: function (data, status, xhr) {
// 请求成功的响应体
console.log(data);
// 请求成功的状态文字描述(success,nocontent等)
console.log(status);
// 请求成功的状态码(200,201,204等)
const {
status: stateCode
} = xhr;
console.log(stateCode);
},
error(xhr, status, error) {
const {
// 请求异常时的json格式响应体
responseJSON,
// 请求异常时的文本响应内容
responseText,
// 请求异常时的状态码
status: stateCode
} = xhr;
console.log(responseJSON);
console.log(responseText);
console.log(stateCode);
// 请求成功的状态文字描述(error等)
console.log(status);
}
});