在日常開發中,一個優雅的API,必須提供簡單明了的回應值,然后根據狀態碼就可以大概知道問題的所在,這里主要整理一下HTTP狀態碼和自定義狀態碼,
1、HTTP狀態碼
當瀏覽者訪問一個網頁時,瀏覽者的瀏覽器會向網頁所在服務器發出請求,當瀏覽器接收并顯示網頁前,此網頁所在的服務器會回傳一個包含 HTTP 狀態碼的資訊頭(server header)用以回應瀏覽器的請求,
常見的HTTP狀態碼有:
200-請求成功,
301-資源(網頁等)被永久轉移到其它URL,
403-服務器拒絕訪問,驗證身份通過了,但是資源沒有權限進行操作,
404-請求資源(網頁等)不存在,
500-內部服務器錯誤,
504-網關超時,服務器作為網關或代理,但是沒有及時從上游服務器收到請求,
2、HTTP狀態碼分類
HTTP狀態碼可以分為5類:訊息回應、成功回應、重定向、客戶端錯誤、服務器錯誤,
|
狀態 |
描述 |
|
100 |
繼續,客戶端應繼續其請求 |
|
101 |
切換協議,服務器根據客戶端的請求切換協議,只能切換到更高級的協議,例如,切換到HTTP的新版本協議, |
|
200 |
請求成功,一般用于GET與POST請求, |
|
201 |
已創建,成功請求并創建了新的資源, |
|
202 |
已接受,已經接受請求,但未處理完成, |
|
203 |
非授權資訊,請求成功,但回傳的meta資訊不在原始的服務器,而是一個副本, |
|
204 |
無內容,服務器成功處理,但未回傳內容, |
|
205 |
重置內容, |
|
300 |
多種選擇,請求的資源可包括多個位置,相應可回傳一個資源特征與地址的串列用于用戶終端(例如:瀏覽器)選擇, |
|
301 |
永久移動,請求的資源已被永久的移動到新URI,回傳資訊會包括新的URI,瀏覽器會自動定向到新URI,今后任何新的請求都應使用新的URI代替, |
|
302 |
臨時移動,與301類似,但資源只是臨時被移動,客戶端應繼續使用原有URI, |
|
303 |
查看其它地址,與301類似,使用GET和POST請求查看, |
|
304 |
未修改,所請求的資源未修改,服務器回傳此狀態碼時,不會回傳任何資源,客戶端通常會快取訪問過的資源,通過提供一個頭資訊指出客戶端希望只回傳在指定日期之后修改的資源, |
|
305 |
使用代理,所請求的資源必須通過代理訪問, |
|
400 |
客戶端請求的語法錯誤,服務器無法理解, |
|
401 |
用戶身份認證失敗, |
|
402 |
保留,將來使用, |
|
403 |
驗證身份通過了,但是資源沒有權限進行操作, |
|
404 |
服務器無法根據客戶端的請求找到資源(網頁), |
|
405 |
客戶端請求中的方法被禁止, |
|
500 |
服務器內部錯誤,無法完成請求, |
|
501 |
服務器不支持請求的功能,無法完成請求, |
|
502 |
作為網關或者代理作業的服務器嘗試執行請求時,從遠程服務器接收到了一個無效的回應 |
|
503 |
由于超載或系統維護,服務器暫時的無法處理客戶端的請求, |
|
504 |
服務器作為網關或代理,但是沒有及時從上游服務器收到請求, |
3、自定義回應狀態碼規范
后端回傳給前端一般使用json格式,定義如下:
{
#回傳狀態碼
Code:integer,
#回傳資訊描述
message:string,
#回傳值
data:object
}
3.1、回傳介面
public interface IResultStatus { /** * 狀態碼 * @return */ Integer errorCode(); /** * 例外資訊 * @return */ String errorMsg(); }
3.2、狀態碼列舉:
public enum ResultStatus implements IResultStatus { /** * 狀態碼及對應資訊 */ //成功狀態碼 SUCCESS(0, "執行成功"), //引數錯誤:1001~1999 PARAM_IS_INVALID(1001, "引數無效"), PARAM_IS_BLANK(1002, "引數為空"), PARAM_TYPE_BIND_ERROR(1003, "引數型別錯誤"), //用戶錯誤:2001~2999 USER_LOGIN_ERROR(2001, "賬號不存在或密碼錯誤"), USER_ACCOUNT_FORBIDDEN(2002, "賬戶已被禁用"), USER_NOT_EXIST(2003, "用戶不存在"); private int errorCode; private String errorMsg; ResultStatus(int errorCode, String errorMsg) { this.errorCode = errorCode; this.errorMsg = errorMsg; } @Override public Integer errorCode() { return errorCode; } @Override public String errorMsg() { return errorMsg; } }
狀態碼和資訊就會一一對應,比較好維護,這樣前端同事在得到回傳值后,根據狀態碼就可以知道,大概是什么錯誤,再根據message相關的資訊描述,可以快速定位,
3.3、回傳資料體
json格式,根據不同的業務有不同的json體,可以設計一個回傳體類Result
@Data public class Result<T> { private Integer code; private String message; private Object data; public Result(ResultStatus restStatus, Object data) { this.code = restStatus.errorCode(); this.message = restStatus.errorMsg(); this.data =https://www.cnblogs.com/pbinlog/archive/2022/04/11/ data; } /** * 業務成功回傳業務代碼和描述資訊 */ public static Result<Void> success() { return new Result<Void>(ResultStatus.SUCCESS, null); } /** * 業務成功回傳業務代碼,描述和回傳的引數 */ public static <T> Result<T> success(T data) { return new Result<T>(ResultStatus.SUCCESS, data); } /** * 業務成功回傳業務代碼,描述和回傳的引數 */ public static <T> Result<T> success(ResultStatus resultStatus, T data) { if (resultStatus == null) { return success(data); } return new Result<T>(resultStatus, data); } /** * 業務例外回傳業務代碼和描述資訊 */ public static <T> Result<T> failure() { return new Result<T>(ResultStatus.PARAM_TYPE_BIND_ERROR, null); } /** * 業務例外回傳業務代碼,描述和回傳的引數 */ public static <T> Result<T> failure(ResultStatus resultStatus) { return failure(resultStatus, null); } /** * 業務例外回傳業務代碼,描述和回傳的引數 */ public static <T> Result<T> failure(ResultStatus resultStatus, T data) { if (resultStatus == null) { return new Result<T>(ResultStatus.PARAM_IS_INVALID, null); } return new Result<T>(resultStatus, data); } }
3.4、回傳體測驗
@RestController @RequestMapping("/api/demo2") public class Demo2Controller { private static final HashMap<String, Object> INFO; static { INFO = new HashMap<>(); INFO.put("name", "張三"); INFO.put("age", "25"); } @GetMapping("/getInfo") public Map<String, Object> getInfo() { return INFO; } @GetMapping("/getInfoResult") public Result<Map<String, Object>> getInfoResult() { return Result.success(INFO); } }
結果參考:


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/457992.html
標籤:其他
下一篇:利用python來制作動態二維碼
