SpringBoot ResponseEntity標(biāo)識Http響應(yīng)方式
一. 說明
ResponseEntity
用來標(biāo)識整個(gè)Http響應(yīng),可以標(biāo)識狀態(tài)碼,Head頭部信息,以及響應(yīng)體。ResponseEntity
的優(yōu)先級高于@ResponseBody。
在返回值不是ResponseEntity的情況下才去檢查有沒有@ResponseBody注解。
如果響應(yīng)類型是ResponseEntity可以不寫@ResponseBody注解,便可返回JSON數(shù)據(jù)或其他類型的數(shù)據(jù),如果同時(shí)使用ResponseEntity和@ResponseBody注解也不會(huì)報(bào)錯(cuò)。
- ResponseEntity是在
org.springframework.http.HttpEntity
的基礎(chǔ)上添加了http status code
(http狀態(tài)碼)。作用是和@ResponseStatus
與@ResponseBody
結(jié)合起來的功能一樣的。 - @ResponseBody可以直接返回JSON結(jié)果, @ResponseEntity不僅可以返回JSON結(jié)果,還可以返回自定義的HttpHeaders和HttpStatus。
二. ResponseEntity.ok().headers(響應(yīng)頭).body(響應(yīng)體)
可用于文件下載
與直接向HttpServletResponse
中寫入OutputStream和header的效果相同
HttpServletResponse是servlet式的寫法,而ResponseEntity是Springt式的寫法
new ResponseEntity<>(響應(yīng)體, 響應(yīng)頭, 狀態(tài)碼)
是非簡寫方式ResponseEntity.ok().headers(響應(yīng)頭).body(響應(yīng)體)
是簡寫方式
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); // 設(shè)置響應(yīng)頭,把文件名稱放入響應(yīng)頭中,確保文件可下載 HttpHeaders headers = new HttpHeaders(); headers.set("Content-Disposition", "attachment;filename=" + URLEncoder.encode(readFile.getFilename(), "UTF-8")); // 設(shè)置內(nèi)容類型為「application/octet-stream」二進(jìn)制流 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); // 獲取File對象 File file = readFile.getFile(); Path path = Paths.get(file.toURI()); // 獲取File對象的字節(jié)碼文件 byte[] bytes = Files.readAllBytes(path); /* * 表示返回一個(gè)字節(jié)碼類型的響應(yīng) * 同時(shí)設(shè)置了響應(yīng)頭和狀態(tài)碼 * */ if (ObjectUtils.isEmpty(readFile.getFilename())) { // ??????簡寫形式 return ResponseEntity.ok().headers(headers).body(bytes); } // ??????非簡寫形式 return new ResponseEntity<>(bytes, headers, HttpStatus.OK); }
三. ResponseEntity.ok(響應(yīng)內(nèi)容)
請求成功,直接把后臺的數(shù)據(jù)響應(yīng)給前臺
@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
狀態(tài)碼為204,表示服務(wù)器成功的處理了請求,但是沒有返回任何內(nèi)容
多用于 更新 和 刪除 的時(shí)候,響應(yīng)給前臺一個(gè)狀態(tài)碼,表示操作成功。
import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @GetMapping("/testResponseEntity3") public ResponseEntity<Void> testResponseEntity3(String param) { // ?http狀態(tài)碼 204 (無內(nèi)容) 服務(wù)器成功處理了請求,但沒有返回任何內(nèi)容。 if (ObjectUtils.isEmpty(param)) { // ?簡寫方式 return ResponseEntity.noContent().build(); } // ?非簡寫方式 return new ResponseEntity<>(HttpStatus.NO_CONTENT); }
五. ResponseEntity.status(狀態(tài)碼)
用于向前臺返回指定的狀態(tài)碼,還可以返回Header和響應(yīng)內(nèi)容
HttpStatus.CREATED
的201狀態(tài)碼表示請求成功并且服務(wù)器創(chuàng)建了新的資源。
@GetMapping("/testResponseEntity4") public ResponseEntity<Void> testResponseEntity4() { // 向數(shù)據(jù)庫中插入數(shù)據(jù) // ...... // ?http狀態(tài)碼 201 (已創(chuàng)建) 請求成功并且服務(wù)器創(chuàng)建了新的資源。 return ResponseEntity.status(HttpStatus.CREATED).build(); } @GetMapping("/testResponseEntity5") public ResponseEntity<String> testResponseEntity5(String param) { // 如果參數(shù)不存在就返回默認(rèn)的圖片url,并返回狀態(tài)碼201 if (!ObjectUtils.isEmpty(param)) { return new ResponseEntity<>("默認(rèn)的圖片URL", HttpStatus.CREATED); } // 向數(shù)據(jù)庫中插入圖片,并返回能訪問圖片地址的url // ...... // ?用于插入數(shù)據(jù)成功之后返回?cái)?shù)據(jù)給前臺 // ?201 狀態(tài)碼,并返回圖片的url return ResponseEntity.status(HttpStatus.CREATED).body("圖片的url"); }
六. ResponseEntity.status(狀態(tài)碼).body(響應(yīng)體)
HttpStatus.BAD_REQUEST
表示狀態(tài)碼400,異常的請求。
@GetMapping("/testResponseEntity6") public ResponseEntity<Map<String, Object>> testResponseEntity6(String param) { // 用來存放校驗(yàn)信息的Map Map<String, Object> map = new HashMap<>(); // 進(jìn)行參數(shù)校驗(yàn) if (param == null) { // 參數(shù)為null,直接返回錯(cuò)誤碼400 return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); } else if ("".equals(param.trim())){ // 參數(shù)為空字符串,返回錯(cuò)誤碼400的同時(shí),還返回錯(cuò)誤信息 map.put("errorMsg","參數(shù)為空"); return ResponseEntity.badRequest().body(map); } // 200 狀態(tài)碼,并指定請求成功的響應(yīng)體 map.put("successMsg", "參數(shù)通過校驗(yàn)"); return ResponseEntity.status(HttpStatus.OK).body(map); // 這種寫法更加簡單,本質(zhì)上和上面是一種寫法 // return ResponseEntity.ok(map); }
七. 前臺ajax
$.ajax({ url: `請求URL`, type: '請求方式', // data: JSON.stringify(param), // 向服務(wù)器發(fā)送的數(shù)據(jù)類型 // contentType: 'application/json;charset=utf-8', // dataType: 'json', success: function (data, status, xhr) { // 請求成功的響應(yīng)體 console.log(data); // 請求成功的狀態(tài)文字描述(success,nocontent等) console.log(status); // 請求成功的狀態(tài)碼(200,201,204等) const { status: stateCode } = xhr; console.log(stateCode); }, error(xhr, status, error) { const { // 請求異常時(shí)的json格式響應(yīng)體 responseJSON, // 請求異常時(shí)的文本響應(yīng)內(nèi)容 responseText, // 請求異常時(shí)的狀態(tài)碼 status: stateCode } = xhr; console.log(responseJSON); console.log(responseText); console.log(stateCode); // 請求成功的狀態(tài)文字描述(error等) console.log(status); } });
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis-plus動(dòng)態(tài)條件查詢QueryWrapper的使用案例
mybatis-plus框架功能很強(qiáng)大,把很多功能都集成了,下面這篇文章主要給大家介紹了關(guān)于Mybatis-plus動(dòng)態(tài)條件查詢QueryWrapper的使用教程,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07Java 格式化輸出JSON字符串的2種實(shí)現(xiàn)操作
這篇文章主要介紹了Java 格式化輸出JSON字符串的2種實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10Intellij IDEA實(shí)現(xiàn)SpringBoot項(xiàng)目多端口啟動(dòng)的兩種方法
有時(shí)候使用springboot項(xiàng)目時(shí)遇到這樣一種情況,用一個(gè)項(xiàng)目需要復(fù)制很多遍進(jìn)行測試,除了端口號不同以外,沒有任何不同。遇到這種情況怎么辦呢?這時(shí)候可以使用Intellij IDEA解決2018-06-06Mybatis查詢方法如何實(shí)現(xiàn)沒有返回值
這篇文章主要介紹了Mybatis查詢方法如何實(shí)現(xiàn)沒有返回值,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10SpringBoot使用jasypt加解密密碼的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringBoot使用jasypt加解密密碼的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10