SpringBoot ResponseEntity標(biāo)識(shí)Http響應(yīng)方式
一. 說(shuō)明
ResponseEntity用來(lái)標(biāo)識(shí)整個(gè)Http響應(yīng),可以標(biāo)識(shí)狀態(tài)碼,Head頭部信息,以及響應(yīng)體。ResponseEntity的優(yōu)先級(jí)高于@ResponseBody。
在返回值不是ResponseEntity的情況下才去檢查有沒(méi)有@ResponseBody注解。
如果響應(yīng)類(lèi)型是ResponseEntity可以不寫(xiě)@ResponseBody注解,便可返回JSON數(shù)據(jù)或其他類(lèi)型的數(shù)據(jù),如果同時(shí)使用ResponseEntity和@ResponseBody注解也不會(huì)報(bào)錯(cuò)。
- ResponseEntity是在
org.springframework.http.HttpEntity的基礎(chǔ)上添加了http status code(http狀態(tài)碼)。作用是和@ResponseStatus與@ResponseBody結(jié)合起來(lái)的功能一樣的。 - @ResponseBody可以直接返回JSON結(jié)果, @ResponseEntity不僅可以返回JSON結(jié)果,還可以返回自定義的HttpHeaders和HttpStatus。
二. ResponseEntity.ok().headers(響應(yīng)頭).body(響應(yīng)體)
可用于文件下載
與直接向HttpServletResponse中寫(xiě)入OutputStream和header的效果相同
HttpServletResponse是servlet式的寫(xiě)法,而ResponseEntity是Springt式的寫(xiě)法
new ResponseEntity<>(響應(yīng)體, 響應(yīng)頭, 狀態(tài)碼)是非簡(jiǎn)寫(xiě)方式ResponseEntity.ok().headers(響應(yīng)頭).body(響應(yīng)體)是簡(jiǎn)寫(xiě)方式
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/測(cè)試文件.text";
ClassPathResource readFile = new ClassPathResource(filePath);
// 設(shè)置響應(yīng)頭,把文件名稱(chēng)放入響應(yīng)頭中,確保文件可下載
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Disposition", "attachment;filename=" + URLEncoder.encode(readFile.getFilename(), "UTF-8"));
// 設(shè)置內(nèi)容類(lèi)型為「application/octet-stream」二進(jìn)制流
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
// 獲取File對(duì)象
File file = readFile.getFile();
Path path = Paths.get(file.toURI());
// 獲取File對(duì)象的字節(jié)碼文件
byte[] bytes = Files.readAllBytes(path);
/*
* 表示返回一個(gè)字節(jié)碼類(lèi)型的響應(yīng)
* 同時(shí)設(shè)置了響應(yīng)頭和狀態(tài)碼
* */
if (ObjectUtils.isEmpty(readFile.getFilename())) {
// ??????簡(jiǎn)寫(xiě)形式
return ResponseEntity.ok().headers(headers).body(bytes);
}
// ??????非簡(jiǎn)寫(xiě)形式
return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
}三. ResponseEntity.ok(響應(yīng)內(nèi)容)
請(qǐng)求成功,直接把后臺(tái)的數(shù)據(jù)響應(yīng)給前臺(tái)
@GetMapping("/testResponseEntity2")
public ResponseEntity<List<String>> testResponseEntity2() {
List<String> list = Arrays.asList("1", "2");
return ResponseEntity.ok(list);
}與下面這種寫(xiě)法 功能相同
@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ù)器成功的處理了請(qǐng)求,但是沒(méi)有返回任何內(nèi)容
多用于 更新 和 刪除 的時(shí)候,響應(yīng)給前臺(tái)一個(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 (無(wú)內(nèi)容) 服務(wù)器成功處理了請(qǐng)求,但沒(méi)有返回任何內(nèi)容。
if (ObjectUtils.isEmpty(param)) {
// ?簡(jiǎn)寫(xiě)方式
return ResponseEntity.noContent().build();
}
// ?非簡(jiǎn)寫(xiě)方式
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}五. ResponseEntity.status(狀態(tài)碼)
用于向前臺(tái)返回指定的狀態(tài)碼,還可以返回Header和響應(yīng)內(nèi)容
HttpStatus.CREATED的201狀態(tài)碼表示請(qǐng)求成功并且服務(wù)器創(chuàng)建了新的資源。
@GetMapping("/testResponseEntity4")
public ResponseEntity<Void> testResponseEntity4() {
// 向數(shù)據(jù)庫(kù)中插入數(shù)據(jù)
// ......
// ?http狀態(tài)碼 201 (已創(chuàng)建) 請(qǐ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ù)庫(kù)中插入圖片,并返回能訪(fǎng)問(wèn)圖片地址的url
// ......
// ?用于插入數(shù)據(jù)成功之后返回?cái)?shù)據(jù)給前臺(tái)
// ?201 狀態(tài)碼,并返回圖片的url
return ResponseEntity.status(HttpStatus.CREATED).body("圖片的url");
}六. ResponseEntity.status(狀態(tài)碼).body(響應(yīng)體)
HttpStatus.BAD_REQUEST表示狀態(tài)碼400,異常的請(qǐng)求。
@GetMapping("/testResponseEntity6")
public ResponseEntity<Map<String, Object>> testResponseEntity6(String param) {
// 用來(lái)存放校驗(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)碼,并指定請(qǐng)求成功的響應(yīng)體
map.put("successMsg", "參數(shù)通過(guò)校驗(yàn)");
return ResponseEntity.status(HttpStatus.OK).body(map);
// 這種寫(xiě)法更加簡(jiǎn)單,本質(zhì)上和上面是一種寫(xiě)法
// return ResponseEntity.ok(map);
}七. 前臺(tái)ajax
$.ajax({
url: `請(qǐng)求URL`,
type: '請(qǐng)求方式',
// data: JSON.stringify(param),
// 向服務(wù)器發(fā)送的數(shù)據(jù)類(lèi)型
// contentType: 'application/json;charset=utf-8',
// dataType: 'json',
success: function (data, status, xhr) {
// 請(qǐng)求成功的響應(yīng)體
console.log(data);
// 請(qǐng)求成功的狀態(tài)文字描述(success,nocontent等)
console.log(status);
// 請(qǐng)求成功的狀態(tài)碼(200,201,204等)
const {
status: stateCode
} = xhr;
console.log(stateCode);
},
error(xhr, status, error) {
const {
// 請(qǐng)求異常時(shí)的json格式響應(yīng)體
responseJSON,
// 請(qǐng)求異常時(shí)的文本響應(yīng)內(nèi)容
responseText,
// 請(qǐng)求異常時(shí)的狀態(tài)碼
status: stateCode
} = xhr;
console.log(responseJSON);
console.log(responseText);
console.log(stateCode);
// 請(qǐng)求成功的狀態(tài)文字描述(error等)
console.log(status);
}
});總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Springboot3?ResponseEntity?完全使用案例
- SpringBoot中ResponseEntity的使用方法舉例詳解
- 一文詳解Spring中ResponseEntity包裝器的使用
- SpringBoot的ResponseEntity類(lèi)返回給前端具體講解
- 解決springboot responseentity<string>亂碼問(wèn)題
- springmvc @ResponseStatus和ResponseEntity的使用
- SpringMVC使用ResponseEntity實(shí)現(xiàn)文件上傳下載
- 使用spring框架ResponseEntity實(shí)現(xiàn)文件下載
- Spring ResponseEntity的使用詳解
相關(guān)文章
Java基礎(chǔ)之?dāng)?shù)組超詳細(xì)知識(shí)總結(jié)
這篇文章主要介紹了Java基礎(chǔ)之?dāng)?shù)組詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05
springboot 使用Spring Boot Actuator監(jiān)控應(yīng)用小結(jié)
本篇文章主要介紹了springboot 使用Spring Boot Actuator監(jiān)控應(yīng)用小結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
springmvc使用JSR-303進(jìn)行數(shù)據(jù)校驗(yàn)實(shí)例
本篇文章主要介紹了詳解springmvc使用JSR-303進(jìn)行數(shù)據(jù)校驗(yàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02
淺談MyBatis通用Mapper實(shí)現(xiàn)原理
這篇文章主要介紹了淺談MyBatis通用Mapper實(shí)現(xiàn)原理,本文會(huì)先介紹通用 Mapper 的簡(jiǎn)單原理,然后使用最簡(jiǎn)單的代碼來(lái)實(shí)現(xiàn)這個(gè)過(guò)程。感興趣的小伙伴們可以參考一下2018-10-10
Spring手動(dòng)生成web.xml配置文件過(guò)程詳解
這篇文章主要介紹了Spring手動(dòng)生成web.xml配置文件過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
vue數(shù)據(jù)響應(yīng)式原理重寫(xiě)函數(shù)實(shí)現(xiàn)數(shù)組響應(yīng)式監(jiān)聽(tīng)
Vue的通過(guò)數(shù)據(jù)劫持的方式實(shí)現(xiàn)數(shù)據(jù)的雙向綁定,即使用Object.defineProperty()來(lái)實(shí)現(xiàn)對(duì)屬性的劫持,但是Object.defineProperty()中的setter是無(wú)法直接實(shí)現(xiàn)數(shù)組中值的改變的劫持行為的,需要的朋友可以參考下2023-05-05

