spring中HttpStatus與ResponseEntity使用及說明
在Spring框架(尤其是Spring Web模塊)中,org.springframework.http.HttpStatus和org.springframework.http.ResponseEntity是處理HTTP響應(yīng)的核心類,二者配合使用可靈活控制HTTP響應(yīng)的狀態(tài)、頭部和體內(nèi)容。
以下是詳細(xì)解析:
一、HttpStatus:HTTP狀態(tài)碼的枚舉封裝
1. 定義與作用
HttpStatus是一個(gè)枚舉類,封裝了所有標(biāo)準(zhǔn)的HTTP狀態(tài)碼(如200、404、500等),每個(gè)枚舉常量對應(yīng)一個(gè)具體的HTTP狀態(tài),包含狀態(tài)碼的數(shù)字值、原因短語(Reason Phrase)等信息。
其核心作用是:提供標(biāo)準(zhǔn)化的HTTP狀態(tài)碼定義,避免硬編碼數(shù)字(如200),提高代碼的可讀性、可維護(hù)性和規(guī)范性。
2. 核心屬性與方法
每個(gè)HttpStatus枚舉常量都包含以下關(guān)鍵信息(可通過方法獲?。?/p>
- 狀態(tài)碼數(shù)值:如
200、404等,通過int value()方法獲取。 - 原因短語:狀態(tài)碼的文字描述(如
OK、Not Found),通過String getReasonPhrase()方法獲取。 - 狀態(tài)碼系列:HTTP狀態(tài)碼分為5類(1xx~5xx),通過
Series series()方法獲取所屬系列(Series是HttpStatus的內(nèi)部枚舉,包含INFORMATIONAL(1xx)、SUCCESSFUL(2xx)、REDIRECTION(3xx)、CLIENT_ERROR(4xx)、SERVER_ERROR(5xx))。
3. 常用枚舉常量
2xx成功類:
OK:200,請求成功(常用)。CREATED:201,資源創(chuàng)建成功(如POST新增資源)。NO_CONTENT:204,請求成功但無響應(yīng)體(如DELETE刪除資源)。
4xx客戶端錯(cuò)誤類:
BAD_REQUEST:400,請求參數(shù)錯(cuò)誤。UNAUTHORIZED:401,未認(rèn)證(如未登錄)。FORBIDDEN:403,權(quán)限不足。NOT_FOUND:404,資源不存在。
5xx服務(wù)器錯(cuò)誤類:
INTERNAL_SERVER_ERROR:500,服務(wù)器內(nèi)部錯(cuò)誤。SERVICE_UNAVAILABLE:503,服務(wù)不可用。
4. 實(shí)用方法
系列判斷:如is2xxSuccessful()(是否為2xx成功狀態(tài))、is4xxClientError()(是否為4xx客戶端錯(cuò)誤)等,簡化狀態(tài)碼類型的判斷。
boolean isSuccess = HttpStatus.OK.is2xxSuccessful(); // true
狀態(tài)碼匹配:matches(int statusCode)判斷當(dāng)前枚舉是否匹配指定的數(shù)字狀態(tài)碼。
boolean isOk = HttpStatus.OK.matches(200); // true
5. 枚舉常量詳解
以下是HTTP狀態(tài)碼的作用和應(yīng)用場景說明,按狀態(tài)碼類別整理為表格:
| 狀態(tài)碼 | 名稱 | 作用 | 應(yīng)用場景 |
|---|---|---|---|
| 1xx 信息性狀態(tài)碼 | 表示服務(wù)器已接收請求,正在處理或等待進(jìn)一步操作 | ||
| 100 | Continue | 服務(wù)器已接收請求頭,允許客戶端繼續(xù)發(fā)送請求體 | 客戶端發(fā)送大文件前,先確認(rèn)服務(wù)器是否愿意接收(如上傳大文件) |
| 101 | Switching Protocols | 服務(wù)器同意切換到客戶端請求的協(xié)議 | WebSocket連接建立時(shí),從HTTP協(xié)議升級到WebSocket協(xié)議 |
| 102 | Processing | 服務(wù)器正在處理請求,尚未完成 | 處理耗時(shí)請求(如復(fù)雜查詢)時(shí),告知客戶端請求仍在處理中 |
| 103 | Early Hints | 服務(wù)器提前返回部分響應(yīng)頭,幫助客戶端預(yù)加載資源 | 大型頁面加載時(shí),提前告知客戶端緩存策略或預(yù)連接資源 |
| 103 | Checkpoint(已廢棄) | 原用于斷點(diǎn)續(xù)傳標(biāo)記 | 已被103 Early Hints替代,不再推薦使用 |
| 2xx 成功狀態(tài)碼 | 表示請求已成功被服務(wù)器接收、理解并處理 | ||
| 200 | OK | 請求成功,返回預(yù)期響應(yīng)內(nèi)容 | 絕大多數(shù)成功的GET、POST等請求(如獲取數(shù)據(jù)、提交表單成功) |
| 201 | Created | 請求成功且創(chuàng)建了新資源 | POST請求創(chuàng)建資源(如新建用戶、訂單)時(shí)返回 |
| 202 | Accepted | 請求已被接受,但尚未處理完成 | 異步處理請求(如后臺(tái)任務(wù)提交后,返回任務(wù)受理狀態(tài)) |
| 203 | Non-Authoritative Information | 請求成功,但響應(yīng)元數(shù)據(jù)來自第三方 | 代理服務(wù)器返回原始服務(wù)器的資源,但部分元數(shù)據(jù)被代理修改 |
| 204 | No Content | 請求成功,但無返回內(nèi)容 | DELETE請求刪除資源成功,或不需要返回內(nèi)容的操作 |
| 205 | Reset Content | 請求成功,客戶端應(yīng)重置視圖 | 表單提交后,告知客戶端重置表單輸入狀態(tài) |
| 206 | Partial Content | 部分請求成功,返回指定范圍的資源 | 斷點(diǎn)續(xù)傳(如大文件下載時(shí),客戶端通過Range頭請求部分內(nèi)容) |
| 207 | Multi-Status | 多狀態(tài)響應(yīng),包含多個(gè)資源的處理結(jié)果 | WebDAV協(xié)議中,批量操作多個(gè)資源時(shí)返回各資源的狀態(tài) |
| 208 | Already Reported | 資源已在其他請求中報(bào)告過 | WebDAV綁定操作中,避免重復(fù)報(bào)告同一資源狀態(tài) |
| 226 | IM Used | 服務(wù)器已執(zhí)行GET請求,響應(yīng)是對資源的修改 | 基于HTTP的增量更新(如版本控制系統(tǒng)返回資源修改部分) |
| 3xx 重定向狀態(tài)碼 | 表示客戶端需要進(jìn)一步操作才能完成請求 | ||
| 300 | Multiple Choices | 請求有多個(gè)可能的響應(yīng),需用戶選擇 | 資源有多個(gè)版本(如不同語言、格式)時(shí),提供選擇列表 |
| 301 | Moved Permanently | 資源已永久移動(dòng)到新URL | 網(wǎng)站域名變更,舊URL永久重定向到新URL(客戶端應(yīng)更新書簽) |
| 302 | Found | 資源臨時(shí)移動(dòng)到新URL | 臨時(shí)跳轉(zhuǎn)(如維護(hù)頁面臨時(shí)重定向到通知頁,客戶端下次仍用原URL) |
| 302 | Moved Temporarily(已廢棄) | 同302 Found,舊稱 | 已被302 Found替代,語義一致 |
| 303 | See Other | 請求完成后,需用GET方法訪問新URL | POST表單提交成功后,重定向到結(jié)果頁(避免刷新重復(fù)提交) |
| 304 | Not Modified | 資源未修改,客戶端可使用緩存 | 客戶端帶ETag/Last-Modified頭請求,服務(wù)器確認(rèn)資源未變時(shí)返回 |
| 305 | Use Proxy(已廢棄) | 資源必須通過指定代理訪問 | 因安全問題已不推薦使用,現(xiàn)代瀏覽器多不支持 |
| 307 | Temporary Redirect | 臨時(shí)重定向,保持原請求方法 | POST請求臨時(shí)重定向時(shí),仍用POST方法訪問新URL(如臨時(shí)服務(wù)器遷移) |
| 308 | Permanent Redirect | 永久重定向,保持原請求方法 | PUT請求永久重定向時(shí),仍用PUT方法訪問新URL(如API域名永久變更) |
| 4xx 客戶端錯(cuò)誤狀態(tài)碼 | 表示請求存在錯(cuò)誤,服務(wù)器無法處理 | ||
| 400 | Bad Request | 請求語法錯(cuò)誤或參數(shù)無效 | 提交的表單數(shù)據(jù)格式錯(cuò)誤、JSON參數(shù)缺失等 |
| 401 | Unauthorized | 請求需要身份驗(yàn)證 | 未登錄用戶訪問需授權(quán)的接口,或令牌過期/無效 |
| 402 | Payment Required | 預(yù)留狀態(tài)碼,需付費(fèi)才能訪問 | 極少使用,理論上用于付費(fèi)內(nèi)容訪問(如訂閱服務(wù)) |
| 403 | Forbidden | 服務(wù)器拒絕請求(已認(rèn)證但無權(quán)限) | 登錄用戶訪問無權(quán)限的資源(如普通用戶訪問管理員頁面) |
| 404 | Not Found | 請求的資源不存在 | 訪問不存在的URL(如拼寫錯(cuò)誤的頁面、已刪除的資源) |
| 405 | Method Not Allowed | 請求方法不被允許 | 用POST訪問只支持GET的接口,或用DELETE訪問只讀資源 |
| 406 | Not Acceptable | 服務(wù)器無法提供客戶端接受的格式 | 客戶端通過Accept頭要求JSON格式,但服務(wù)器只支持XML |
| 407 | Proxy Authentication Required | 需要代理服務(wù)器認(rèn)證 | 客戶端通過代理訪問時(shí),未通過代理的身份驗(yàn)證 |
| 408 | Request Timeout | 客戶端請求超時(shí) | 客戶端發(fā)送請求過慢,服務(wù)器等待超時(shí) |
| 409 | Conflict | 請求與服務(wù)器當(dāng)前狀態(tài)沖突 | 并發(fā)修改資源(如兩人同時(shí)編輯文檔,后提交者沖突) |
| 410 | Gone | 資源已永久刪除,不再可用 | 原URL對應(yīng)的資源被徹底刪除,且無替代地址 |
| 411 | Length Required | 服務(wù)器要求Content-Length頭,客戶端未提供 | 客戶端發(fā)送帶請求體的請求(如POST)但未指定內(nèi)容長度 |
| 412 | Precondition Failed | 請求頭的前置條件不滿足 | 客戶端用If-Match驗(yàn)證資源版本,服務(wù)器發(fā)現(xiàn)版本不匹配 |
| 413 | Payload Too Large | 請求體過大,服務(wù)器拒絕處理 | 客戶端上傳超大文件,超過服務(wù)器限制 |
| 413 | Request Entity Too Large(已廢棄) | 同413 Payload Too Large,舊稱 | 已被413 Payload Too Large替代 |
| 414 | URI Too Long | 請求URI過長,服務(wù)器無法處理 | 客戶端請求的URL包含過多參數(shù)或過長路徑 |
| 414 | Request-URI Too Long(已廢棄) | 同414 URI Too Long,舊稱 | 已被414 URI Too Long替代 |
| 415 | Unsupported Media Type | 請求體的媒體類型不被支持 | 客戶端發(fā)送application/xml數(shù)據(jù),但服務(wù)器只支持application/json |
| 416 | Requested Range Not Satisfiable | Range請求的范圍無效 | 客戶端請求文件的第1000-2000字節(jié),但文件僅500字節(jié) |
| 417 | Expectation Failed | 服務(wù)器無法滿足Expect請求頭 | 客戶端用Expect: 100-continue,但服務(wù)器不支持 |
| 418 | I’m a teapot | 服務(wù)器是茶壺,不能煮咖啡(玩笑性質(zhì)) | 愚人節(jié)玩笑,多用于測試或彩蛋(如某些API的趣味響應(yīng)) |
| 419 | Insufficient Space On Resource(已廢棄) | 資源存儲(chǔ)空間不足 | 舊版WebDAV使用,已被507 Insufficient Storage替代 |
| 420 | Method Failure(已廢棄) | 請求方法執(zhí)行失敗 | 曾用于Spring框架,已棄用,建議用422或500替代 |
| 421 | Destination Locked(已廢棄) | 目標(biāo)資源被鎖定 | 舊版WebDAV使用,已被423 Locked替代 |
| 422 | Unprocessable Entity | 請求語法正確,但語義錯(cuò)誤 | 表單驗(yàn)證失?。ㄈ玎]箱格式正確但已被注冊) |
| 423 | Locked | 資源被鎖定,無法操作 | WebDAV中,資源被其他用戶鎖定編輯時(shí) |
| 424 | Failed Dependency | 因前置請求失敗,當(dāng)前請求無法完成 | WebDAV批量操作中,某資源處理失敗導(dǎo)致后續(xù)請求依賴失敗 |
| 425 | Too Early | 服務(wù)器不愿處理可能重復(fù)的請求 | 防止重放攻擊(如客戶端重復(fù)發(fā)送同一請求) |
| 426 | Upgrade Required | 客戶端需升級協(xié)議 | 服務(wù)器僅支持HTTPS,客戶端用HTTP訪問時(shí),要求升級 |
| 428 | Precondition Required | 服務(wù)器要求請求包含前置條件 | 服務(wù)器為防止并發(fā)修改,要求請求帶If-Match等頭 |
| 429 | Too Many Requests | 客戶端請求過于頻繁,觸發(fā)限流 | API調(diào)用超過速率限制(如1分鐘內(nèi)請求超過100次) |
| 431 | Request Header Fields Too Large | 請求頭過大,服務(wù)器拒絕處理 | 客戶端發(fā)送的Cookie或其他頭信息超過服務(wù)器限制 |
| 451 | Unavailable For Legal Reasons | 資源因法律原因不可用 | 資源被法院要求屏蔽(如版權(quán)侵權(quán)、違法內(nèi)容) |
| 5xx 服務(wù)器錯(cuò)誤狀態(tài)碼 | 表示服務(wù)器處理請求時(shí)發(fā)生錯(cuò)誤 | ||
| 500 | Internal Server Error | 服務(wù)器內(nèi)部通用錯(cuò)誤 | 服務(wù)器代碼異常(如NullPointerException) |
| 501 | Not Implemented | 服務(wù)器不支持請求的方法 | 客戶端使用服務(wù)器未實(shí)現(xiàn)的HTTP方法(如PROPFIND) |
| 502 | Bad Gateway | 網(wǎng)關(guān)/代理收到無效響應(yīng) | 反向代理服務(wù)器從上游服務(wù)器收到錯(cuò)誤響應(yīng) |
| 503 | Service Unavailable | 服務(wù)器暫時(shí)不可用 | 服務(wù)器維護(hù)、過載時(shí),返回此狀態(tài)(可帶Retry-After頭) |
| 504 | Gateway Timeout | 網(wǎng)關(guān)/代理等待上游響應(yīng)超時(shí) | 反向代理服務(wù)器等待后端服務(wù)響應(yīng)超時(shí) |
| 505 | HTTP Version Not Supported | 服務(wù)器不支持請求的HTTP版本 | 客戶端用HTTP/3請求,服務(wù)器僅支持HTTP/1.1 |
| 506 | Variant Also Negotiates | 內(nèi)容協(xié)商過程出錯(cuò)(循環(huán)引用) | 服務(wù)器配置錯(cuò)誤,導(dǎo)致協(xié)商過程無限循環(huán) |
| 507 | Insufficient Storage | 服務(wù)器存儲(chǔ)不足 | WebDAV中,服務(wù)器無法存儲(chǔ)上傳的資源 |
| 508 | Loop Detected | 服務(wù)器檢測到無限循環(huán) | WebDAV中,處理請求時(shí)發(fā)現(xiàn)資源引用循環(huán) |
| 509 | Bandwidth Limit Exceeded | 服務(wù)器帶寬超限 | 非標(biāo)準(zhǔn)狀態(tài)碼,部分服務(wù)器用于表示帶寬用盡 |
| 510 | Not Extended | 請求需要擴(kuò)展,但服務(wù)器不支持 | 客戶端請求的擴(kuò)展功能未被服務(wù)器實(shí)現(xiàn) |
| 511 | Network Authentication Required | 需要網(wǎng)絡(luò)認(rèn)證 | 公共WiFi中,用戶未登錄前訪問互聯(lián)網(wǎng)(跳轉(zhuǎn)登錄頁) |
二、ResponseEntity:HTTP響應(yīng)的完整封裝
1. 定義與作用
ResponseEntity<T>是一個(gè)泛型類,用于封裝HTTP響應(yīng)的完整信息,包括:
- 響應(yīng)狀態(tài)碼(通過
HttpStatus指定); - 響應(yīng)頭(
HttpHeaders); - 響應(yīng)體(泛型
T,即返回給客戶端的數(shù)據(jù))。
其核心作用是:在Spring MVC/WebFlux控制器中,作為方法返回值,精細(xì)化控制HTTP響應(yīng)的各個(gè)部分(相比@ResponseBody僅能控制響應(yīng)體,ResponseEntity更靈活)。
2. 核心結(jié)構(gòu)
ResponseEntity的核心組成:
private final T body:響應(yīng)體(可為null,如204狀態(tài)無體);private final HttpHeaders headers:響應(yīng)頭(如Content-Type、Authorization等);private final HttpStatus statusCode:響應(yīng)狀態(tài)碼(HttpStatus枚舉)。
3. 常用創(chuàng)建方式
ResponseEntity提供了多種靜態(tài)工廠方法和構(gòu)造器,簡化創(chuàng)建過程:
直接指定狀態(tài)碼和響應(yīng)體:
// 返回200 OK + 響應(yīng)體 return ResponseEntity.ok(user); // 等價(jià)于 ResponseEntity.status(HttpStatus.OK).body(user) // 返回201 Created + 響應(yīng)體 return ResponseEntity.status(HttpStatus.CREATED).body(newUser);
帶響應(yīng)頭的響應(yīng):
HttpHeaders headers = new HttpHeaders();
headers.add("Location", "/users/123"); // 新增資源的URL
return new ResponseEntity<>(user, headers, HttpStatus.CREATED);
無響應(yīng)體的響應(yīng):
// 返回204 No Content(無響應(yīng)體) return ResponseEntity.noContent().build(); // 返回404 Not Found(無響應(yīng)體) return ResponseEntity.notFound().build();
自定義響應(yīng)頭和狀態(tài):
return ResponseEntity.status(HttpStatus.FORBIDDEN)
.header("X-Error", "Permission denied")
.body("無權(quán)訪問");
4. 核心方法
T getBody():獲取響應(yīng)體(可能為null);HttpHeaders getHeaders():獲取響應(yīng)頭;HttpStatus getStatusCode():獲取響應(yīng)狀態(tài)碼(HttpStatus枚舉);int getStatusCodeValue():獲取狀態(tài)碼的數(shù)字值(如200)。
三、二者的關(guān)系與使用場景
1. 配合關(guān)系
HttpStatus是ResponseEntity的“狀態(tài)碼工具”:ResponseEntity通過HttpStatus枚舉來指定響應(yīng)的狀態(tài)碼,避免直接使用數(shù)字,保證規(guī)范性。
2. 典型使用場景
在Spring控制器中,當(dāng)需要:
- 不僅返回?cái)?shù)據(jù)(響應(yīng)體),還需指定狀態(tài)碼(如創(chuàng)建資源返回201);
- 自定義響應(yīng)頭(如設(shè)置
Cache-Control、Location); - 返回?zé)o響應(yīng)體的狀態(tài)(如204、404);
此時(shí)必須使用ResponseEntity,并結(jié)合HttpStatus指定狀態(tài)。
示例:
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User savedUser = userService.save(user); // 保存用戶
HttpHeaders headers = new HttpHeaders();
headers.setLocation(URI.create("/users/" + savedUser.getId())); // 資源位置
// 返回201狀態(tài) + 響應(yīng)體 + 自定義頭
return new ResponseEntity<>(savedUser, headers, HttpStatus.CREATED);
}
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
return userService.findById(id)
.map(ResponseEntity::ok) // 存在則返回200 + 數(shù)據(jù)
.orElseGet(() -> ResponseEntity.notFound().build()); // 不存在返回404
}
}
總結(jié)
HttpStatus:標(biāo)準(zhǔn)化HTTP狀態(tài)碼的枚舉,提供狀態(tài)碼、原因短語及系列判斷,避免硬編碼。ResponseEntity:封裝HTTP響應(yīng)的完整信息(狀態(tài)碼、頭、體),是Spring控制器中精細(xì)化控制響應(yīng)的核心類。
二者配合使用,可優(yōu)雅地處理各種HTTP響應(yīng)場景,是Spring Web開發(fā)的基礎(chǔ)工具。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java面向?qū)ο笤O(shè)計(jì)原則之開閉原則示例解析
這篇文章主要介紹了java面向?qū)ο笤O(shè)計(jì)原則之開閉原則的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-10-10
深入解析Java的Servlet過濾器的原理及其應(yīng)用
這篇文章主要介紹了深入解析Java的Servlet過濾器的原理及應(yīng)用,Java編寫的Servlet通常是一個(gè)與網(wǎng)頁一起作用于瀏覽器客戶端的程序,需要的朋友可以參考下2016-01-01
java 實(shí)現(xiàn)單鏈表逆轉(zhuǎn)詳解及實(shí)例代碼
這篇文章主要介紹了java 實(shí)現(xiàn)單鏈表逆轉(zhuǎn)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
Spring Boot中捕獲異常錯(cuò)誤信息并將其保存到數(shù)據(jù)庫中的操作方法
這篇文章主要介紹了Spring Boot中捕獲異常錯(cuò)誤信息并將其保存到數(shù)據(jù)庫中的操作方法,通過實(shí)例代碼介紹了使用Spring Data JPA創(chuàng)建一個(gè)異常信息的存儲(chǔ)庫接口,以便將異常信息保存到數(shù)據(jù)庫,需要的朋友可以參考下2023-10-10
關(guān)于Sentinel中冷啟動(dòng)限流原理WarmUpController
這篇文章主要介紹了關(guān)于Sentinel中冷啟動(dòng)限流原理WarmUpController,具有很好的參考價(jià)值,希望對大家有所幫助。2023-04-04
利用Jackson實(shí)現(xiàn)數(shù)據(jù)脫敏的示例詳解
在我們的企業(yè)項(xiàng)目中,為了保護(hù)用戶隱私,數(shù)據(jù)脫敏成了必不可少的操作,那么我們怎么優(yōu)雅的利用Jackson實(shí)現(xiàn)數(shù)據(jù)脫敏呢,本文就來和大家詳細(xì)聊聊,希望對大家有所幫助2023-05-05

