SpringBoot ResponseEntity标识Http响应方式
作者:fengyehongWorld
这篇文章主要介绍了SpringBoot ResponseEntity标识Http响应方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
一. 说明
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。
二. ResponseEntity.ok().headers(响应头).body(响应体)
可用于文件下载
与直接向HttpServletResponse
中写入OutputStream和header的效果相同
HttpServletResponse是servlet式的写法,而ResponseEntity是Springt式的写法
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); }
三. ResponseEntity.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; }
四. ResponseEntity<Void>
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); }
五. ResponseEntity.status(状态码)
用于向前台返回指定的状态码,还可以返回Header和响应内容
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"); }
六. ResponseEntity.status(状态码).body(响应体)
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
$.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); } });
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。