參考資料
目錄
一. 說明
二. ResponseEntity.ok().headers(響應頭).body(響應體)
三. ResponseEntity.ok(響應內容)
四. ResponseEntity`<Void>`
五. ResponseEntity.status(狀態碼)
六. ResponseEntity.status(狀態碼).body(響應體)
七. 前臺ajax
一. 說明
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);
}
});
轉自:https://blog.csdn.net/feyehong/article/details/128512661
下面這個就是返回401,帶上內容的那種
import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/test") public class TestController { @RequestMapping("/test01.html") public ResponseEntity test01() { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("權限驗證失敗。"); } }