可维护的返回码

Response Code

缘由

常见在前端调用后端api接口时通常有如下三个字段:

code: 1, 1表示成功,0表示错误 message:"成功" data:{}

code值为1和0来区分成功或者失败,也有人用Http的code,200表示成功等等。

但是考虑下分布式的场景,服务比较多,场景比较多,业务相对复杂点,当你调用其他服务的接口,需要在某个特定的场景下做一些事情的时候,需要怎么区分,或者可以看看其他开放平台接口。比如微信,支付宝等等,你会发现都会对不同的返回结果有个特殊的返回码。

所以如果对于一个长期维护的产品而言,把返回码维护好是非常重要的和必要的。

返回码维护的好处

  • 便于长期维护
  • 避免在java代码中直接写字符串,不符合阿里规约
  • 便于将来的服务拆分和扩展
  • 便于与其他系统进行对接和开放接口
  • 便于前端做更加细致的操作
  • 暂时想到这么多

ResponseCodeConst类设计

希望有个地方来维护这些返回码,通常最简单的想法是放到一个常量类或者枚举enum类里面,想法挺好,但是这样又有些问题:

  1. 怎么避免返回码的重复?
  2. 业务多会导致这个类特别大,难维护
  3. 如何定义范围?

带着以上问题可以总结如下:

  • 为避免类特别大,必须放到多个类里面
  • 必须要有范围的定义和说明
  • 必须要有全局的码值和避免范围重复的检测机制

所以 ResponseCodeConst 类横空出世。

1、代码如下
public class ResponseCodeConst {

    // 范围声明
    static {
        // 通用业务范围,从0开始,step=1000
        ResponseCodeContainer.register(ResponseCodeConst.class, 0, 1000);
        // 登录业务
        ResponseCodeContainer.register(LoginResponseCodeConst.class, 1001, 2000);
        // 部门业务
        ResponseCodeContainer.register(DepartmentResponseCodeConst.class, 2001, 3000);
        //其他
    }

    public static final ResponseCodeConst SUCCESS = new ResponseCodeConst(1, "success", true);
    public static final ResponseCodeConst COMMON_ERROR = new ResponseCodeConst(2, "我错了....");
    public static final ResponseCodeConst ERROR_PARAM = new ResponseCodeConst(101, "参数异常!");

    protected int code;
    protected String msg;
    protected boolean success;
2、ResponseCodeConst基类
  • 定义基本属性
  • 定义各个业务code范围
  • 进行范围和重复检测
  • 通用的范围code定义到基类
3、范围声明

对于每个业务模块的XxxResponseCodeConst,继承自基类,并将此类的code的起始值和末尾值注册进来

ResponseCodeContainer类中有两个map用于接受注册的code,用于检测。

4、启动检测

因为都是static常量,且类结构相同,所以可以在项目启动的时候利用static静态加载和反射技术进行全项目的code值检测。

即 调用ResponseCodeConst.init()方法


作者简介:
卓大, 1024创新实验室主任,混迹于各个技术,熟悉点java,略懂点前端。