日常の開発では、洗練されたAPIがシンプルで明確な応答値を提供する必要があります。そうすれば、ステータスコードに基づいて問題を大まかに知ることができます。ここでは、主にHTTPステータスコードとカスタムステータスコードを整理します。
1.HTTPステータスコード
ブラウザがWebページにアクセスすると、ブラウザのブラウザはWebページが配置されているサーバーにリクエストを送信します。ブラウザがWebページを受信して表示する前に、Webページが配置されているサーバーは、ブラウザの要求に応じてHTTPステータスコードを含むサーバーヘッダーを返します。
一般的なHTTPステータスコードは次のとおりです。
200-リクエストは成功しました。
301-リソース(Webページなど)は永続的に別のURLに移動されます。
403-サーバーによってアクセスが拒否されました。認証に合格しましたが、リソースに操作する権限がありません。
404-要求されたリソース(Webページなど)が存在しません。
500内部サーバーエラー。
504-ゲートウェイがタイムアウトしました。サーバーはゲートウェイまたはプロキシとして機能しますが、アップストリームサーバーからの要求をタイムリーに受信しません。
2.HTTPステータスコードの分類
HTTPステータスコードは、メッセージ応答、成功応答、リダイレクト、クライアントエラー、サーバーエラーの5つのカテゴリに分類できます。
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;
}
}
复制代码
ステータスコードと情報は1つずつ対応しているため、保守が容易です。このようにして、フロントエンドの同僚は戻り値を取得した後、ステータスコードに基づいてエラーが何であるかを知ることができ、メッセージ関連情報の説明に従ってエラーをすばやく見つけることができます。
3.3、データ本文を返す
json形式、さまざまなビジネスに応じてさまざまなjsonボディがあり、リターンボディクラスを設計できます結果
@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 = 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);
}
}
复制代码
結果参照: