【Java学習】APIインターフェースデータ仕様

日常の開発では、洗練された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);
    }
}
复制代码

結果参照:

おすすめ

転載: juejin.im/post/7085264361945727007
おすすめ