1、Result 工具類
依賴:工具類依賴lombok,HttpStatusEnum 兩個類,如果想自定義狀態碼可以修改HttpStatusEnum.java為自己的狀態碼和注釋
import lombok.Data; /** * @author zhanghuiwen * http返回值 */ @Data public class Result<T> { public Result(boolean success, int code) { this.setSuccess(success); this.setCode(code); } public Result(boolean success, int code, T data) { this.setSuccess(success); this.setCode(code); this.setData(data); } public Result(boolean success, int code, String msg) { this.setSuccess(success); this.setCode(code); this.setData(data); } /** * 請求是否成功 * true:成功 * false:失敗 */ private boolean success; /** * 狀態碼 * 成功:200 * 失敗:其他 */ private int code; /** * 失敗狀態碼描述 * 如果成功不返回 * 失敗返回狀態碼對應的msg消息 */ private String msg; /** * 請求數據的結果 */ private T data; public static <T> Result<T> success() { return new Result<T>(true, 200); } public static <T> Result<T> success(T data) { return new Result<T>(true, 200, data); } public static <T> Result<T> fail(HttpStatusEnum httpStatusEnum) { return new Result<T>(false, httpStatusEnum.code(), httpStatusEnum.reasonPhraseUS()); } public static <T> Result<T> fail(HttpStatusEnum httpStatusEnum, String msg) { return new Result<T>(false, httpStatusEnum.code(), msg); } }
2、HttpStatusEnum 枚舉了所有http狀態碼
/** * http所有狀態碼枚舉 */ public enum HttpStatusEnum { /** * http狀態碼枚舉所有狀態碼注解 */ CONTINUE(100, "Continue", "請繼續發送請求的剩余部分"), SWITCHING_PROTOCOLS(101, "Switching Protocols", "協議切換"), PROCESSING(102, "Processing", "請求將繼續執行"), CHECKPOINT(103, "Checkpoint", "可以預加載"), OK(200, "OK", "請求已經成功處理"), CREATED(201, "Created", "請求已經成功處理,並創建了資源"), ACCEPTED(202, "Accepted", "請求已經接受,等待執行"), NON_AUTHORITATIVE_INFORMATION(203, "Non-Authoritative Information", "請求已經成功處理,但是信息不是原始的"), NO_CONTENT(204, "No Content", "請求已經成功處理,沒有內容需要返回"), RESET_CONTENT(205, "Reset Content", "請求已經成功處理,請重置視圖"), PARTIAL_CONTENT(206, "Partial Content", "部分Get請求已經成功處理"), MULTI_STATUS(207, "Multi-Status", "請求已經成功處理,將返回XML消息體"), ALREADY_REPORTED(208, "Already Reported", "請求已經成功處理,一個DAV的綁定成員被前一個請求枚舉,並且沒有被再一次包括"), IM_USED(226, "IM Used", "請求已經成功處理,將響應一個或者多個實例"), MULTIPLE_CHOICES(300, "Multiple Choices", "提供可供選擇的回饋"), MOVED_PERMANENTLY(301, "Moved Permanently", "請求的資源已經永久轉移"), FOUND(302, "Found", "請重新發送請求"), // MOVED_TEMPORARILY(302, "Moved Temporarily", "") 已經過時 SEE_OTHER(303, "See Other", "請以Get方式請求另一個URI"), NOT_MODIFIED(304, "Not Modified", "資源未改變"), USE_PROXY(305, "Use Proxy", "請通過Location域中的代理進行訪問"), // 306在新版本的規范中被棄用 TEMPORARY_REDIRECT(307, "Temporary Redirect", "請求的資源臨時從不同的URI響應請求"), RESUME_INCOMPLETE(308, "Resume Incomplete", "請求的資源已經永久轉移"), BAD_REQUEST(400, "Bad Request", "請求錯誤,請修正請求"), UNAUTHORIZED(401, "Unauthorized", "沒有被授權或者授權已經失效"), PAYMENT_REQUIRED(402, "Payment Required", "預留狀態"), FORBIDDEN(403, "Forbidden", "請求被理解,但是拒絕執行"), NOT_FOUND(404, "Not Found", "資源未找到"), METHOD_NOT_ALLOWED(405, "Method Not Allowed", "請求方法不允許被執行"), NOT_ACCEPTABLE(406, "Not Acceptable", "請求的資源不滿足請求者要求"), PROXY_AUTHENTICATION_REQUIRED(407, "Proxy Authentication Required", "請通過代理進行身份驗證"), REQUEST_TIMEOUT(408, "Request Timeout", "請求超時"), CONFLICT(409, "Conflict", "請求沖突"), GONE(410, "Gone", "請求的資源不可用"), LENGTH_REQUIRED(411, "Length Required", "Content-Length未定義"), PRECONDITION_FAILED(412, "Precondition Failed", "不滿足請求的先決條件"), REQUEST_ENTITY_TOO_LARGE(413, "Request Entity Too Large", "請求發送的實體太大"), REQUEST_URI_TOO_LONG(414, "Request-URI Too Long", "請求的URI超長"), UNSUPPORTED_MEDIA_TYPE(415, "Unsupported Media Type", "請求發送的實體類型不受支持"), REQUESTED_RANGE_NOT_SATISFIABLE(416, "Requested range not satisfiable", "Range指定的范圍與當前資源可用范圍不一致"), EXPECTATION_FAILED(417, "Expectation Failed", "請求頭Expect中指定的預期內容無法被服務器滿足"), // I_AM_A_TEAPOT(418, "I'm a teapot", ""), 該代碼沒有被服務器實現 // INSUFFICIENT_SPACE_ON_RESOURCE(419, "Insufficient Space On Resource", ""), 已經過時 // METHOD_FAILURE(420, "Method Failure", ""), 已經過時 // DESTINATION_LOCKED(421, "Destination Locked", ""), 已經過時 UNPROCESSABLE_ENTITY(422, "Unprocessable Entity", "請求格式正確,但是由於含有語義錯誤,無法響應"), LOCKED(423, "Locked", "當前資源被鎖定"), FAILED_DEPENDENCY(424, "Failed Dependency", "由於之前的請求發生錯誤,導致當前請求失敗"), UPGRADE_REQUIRED(426, "Upgrade Required", "客戶端需要切換到TLS1.0"), PRECONDITION_REQUIRED(428, "Precondition Required", "請求需要提供前置條件"), TOO_MANY_REQUESTS(429, "Too Many Requests", "請求過多"), REQUEST_HEADER_FIELDS_TOO_LARGE(431, "Request Header Fields Too Large", "請求頭超大,拒絕請求"), INTERNAL_SERVER_ERROR(500, "Internal Server Error", "服務器內部錯誤"), NOT_IMPLEMENTED(501, "Not Implemented", "服務器不支持當前請求的部分功能"), BAD_GATEWAY(502, "Bad Gateway", "響應無效"), SERVICE_UNAVAILABLE(503, "Service Unavailable", "服務器維護或者過載,拒絕服務"), GATEWAY_TIMEOUT(504, "Gateway Timeout", "上游服務器超時"), HTTP_VERSION_NOT_SUPPORTED(505, "HTTP Version not supported", "不支持的HTTP版本"), VARIANT_ALSO_NEGOTIATES(506, "Variant Also Negotiates", "服務器內部配置錯誤"), INSUFFICIENT_STORAGE(507, "Insufficient Storage", "服務器無法完成存儲請求所需的內容"), LOOP_DETECTED(508, "Loop Detected", "服務器處理請求時發現死循環"), BANDWIDTH_LIMIT_EXCEEDED(509, "Bandwidth Limit Exceeded", "服務器達到帶寬限制"), NOT_EXTENDED(510, "Not Extended", "獲取資源所需的策略沒有被滿足"), NETWORK_AUTHENTICATION_REQUIRED(511, "Network Authentication Required", "需要進行網絡授權"); private final int code; private final String reasonPhraseUS; private final String reasonPhraseCN; private static final int INFORMATIONAL = 1, SUCCESSFUL = 2, REDIRECTION = 3, CLIENT_ERROR = 4, SERVER_ERROR = 5; HttpStatusEnum(int code, String reasonPhraseUS, String reasonPhraseCN) { this.code = code; this.reasonPhraseUS = reasonPhraseUS; this.reasonPhraseCN = reasonPhraseCN; } public int code() { return code; } public String reasonPhraseUS() { return reasonPhraseUS; } public String reasonPhraseCN() { return reasonPhraseCN; } public static HttpStatusEnum valueOf(int code) { for (HttpStatusEnum httpStatus : values()) { if (httpStatus.code() == code) { return httpStatus; } } throw new IllegalArgumentException("No matching constant for [" + code + "]"); } public boolean is1xxInformational() { return type() == INFORMATIONAL; } public boolean is2xxSuccessful() { return type() == SUCCESSFUL; } public boolean is3xxRedirection() { return type() == REDIRECTION; } public boolean is4xxClientError() { return type() == CLIENT_ERROR; } public boolean is5xxServerError() { return type() == SERVER_ERROR; } private int type() { return (int) code / 100; } }