Java 前后端 统一返回数据格式

1 概述

现在前后端交互,基本上都有统一的返回数据结构,因此我特地总结了相关知识,形成这篇博客。

2 状态码定义


/**
 * description: 基本返回状态码
 */
public enum RespBasicCode {
    /**
     * 4xx 客户端异常 5xx服务器异常
     */

    SUCCESS("200", "成功"),
    PARAMETER_ERROR("400", "参数异常"),
    BAD_REQUEST("400", "无效的请求"),
    ERROR("500", "异常错误"),

    /*--------根据业务实际情况,可以自己定义返回的状态码-------*/
    ;

    /**
     * 返回状态码
     */
    private String code;

    /**
     * 返回描述
     */
    private String result;

    RespBasicCode(String code, String result) {
        this.code = code;
        this.result = result;
    }

    public String getCode() {
        return code;
    }

    public String getResult() {
        return result;
    }

    /**
     * 通过code 获取RespBasicCode对象
     *
     * @param code 状态码
     * @return RespBasicCode对象
     */
    public static RespBasicCode getRespBasicCodeByCode(String code) {
        if (code == null || "".equals(code)) {
            return null;
        }
        for (RespBasicCode respBasicCode : RespBasicCode.values()) {
            if (respBasicCode.getCode().equals(code)) {
                return respBasicCode;
            }
        }
        return null;
    }

    /**
     * 通过code 获取resultDes
     *
     * @param code 状态码
     * @return resultDes
     */
    public static String getResultDesByCode(String code) {
        if (code == null || "".equals(code)) {
            return null;
        }
        for (RespBasicCode respBasicCode : RespBasicCode.values()) {
            if (respBasicCode.getCode().equals(code)) {
                return respBasicCode.getResult();
            }
        }
        return null;
    }
}

3 统一返回数据结构


/**
 * description: 服务之间交互统一响应
 * 返回划分为2部分:分别是头部和实体信息
 * 头部返回状态为200,则从Body里面取数据
 * 如果头部返回异常状态码,则从头部取出错误信息
 */
public class ActionResponse<T> {

    /**
     * 返回的头部信息
     */
    private Head head = new Head();

    /**
     * 返回主体信息
     */
    private Body body = new Body();

    /**
     * 返回成功,没有data数据 结果:
     * {
     *     "head": {
     *         "code": "200",
     *         "result": "成功"
     *     },
     *     "body": null
     * }
     *
     * @param <T> Body中 data类型
     * @return ActionResponse
     */

    public static <T> ActionResponse<T> success() {
        return new ActionResponse<T>(RespBasicCode.SUCCESS.getCode(),RespBasicCode.SUCCESS.getResult(),null);
    }

    /**
     * 返回成功,并且带有数据 结果:
     * {
     *     "head": {
     *         "code": "200",
     *         "result": "成功"
     *     },
     *     "body": [
     *         "你好 宇宙"
     *     ]
     * }
     *
     * @param data 数据
     * @param <T> Body中 data类型
     * @return ActionResponse
     */
    public static <T> ActionResponse<T> success(T data) {
        return new ActionResponse<>(RespBasicCode.SUCCESS.getCode(),RespBasicCode.SUCCESS.getResult(), data);
    }

    /**
     * 返回失败,自定义状态码,并且没有任何数据 结果:
     *{
     *     "head": {
     *         "code": "400",
     *         "result": "参数异常"
     *     },
     *     "body": null
     * }
     *
     * @param respCode 状态码对象
     * @param <T> Body中 data类型
     * @return ActionResponse
     */
    public static <T> ActionResponse<T> fail(RespBasicCode respCode) {
        return new ActionResponse<>(respCode.getCode(),respCode.getResult(),null);
    }

    /**
     * 返回失败,自定义状态码,并且封装数据 结果:
     *{
     *     "head": {
     *         "code": "400",
     *         "result": "参数异常"
     *     },
     *     "body": [
     *         "你好 宇宙"
     *     ]
     * }
     *
     * @param respCode respCode 状态码对象
     * @param data 数据
     * @param <T> Body中 data类型
     * @return ActionResponse
     */
    public static <T> ActionResponse<T> fail(RespBasicCode respCode, T data) {
        return new ActionResponse<>(respCode.getCode(), respCode.getResult(), data);
    }

    /**
     * 自定义返回信息
     *
     * @param code head中的code
     * @param result head中的result
     * @param data body中的数据
     * @param <T> Body中 data类型
     * @return ActionResponse
     */
    public static <T> ActionResponse<T> custom(String code,String result, T data){
        return new ActionResponse<>(code,result,data);
    }

    /**
     * 真正的数据源泉,所有方法均是调用这个构造器
     *
     * @param code head中的具体的状态码
     * @param result head中的描述信息
     */
    private ActionResponse(String code, String result, T data) {
        this.head.code = code;
        this.head.result = result;
        this.body.data = data;
    }

    public Head getHead() {
        return head;
    }

    public T getBody() {
        return body.getData();
    }

    /**
     * 返回的实体信息
     */
    private class Body {
        /**
         * 数据域,如果是分页直接为PageResult即可
         */
        private T data;

        public T getData() {
            return data;
        }
    }

    /**
     * 响应的头部
     */
    private class Head {
        /**
         * 状态码
         */
        private String code;

        /**
         * 结果描述
         */
        private String result;

        public String getCode() {
            return code;
        }

        public String getResult() {
            return result;
        }

    }
}

猜你喜欢

转载自www.cnblogs.com/AdaiCoffee/p/11286098.html