• 如何优雅的定义统一响应对象


    Hope is being able to see there is light despite all of the darkness

    目前主流开发方式都是前后端分离的,定义一种通用统一的返回格式,在前后端进行沟通时是非常有必要的,大家基于这个约定去理解,出现问题能够快速定位,接下来就介绍一下如何优雅定义统一响应对象

    设计统一响应对象

    定义一个统一响应对象,这个对象需要完成的事情有

    • 有一个响应状态码
    • 有一个响应消息串
    • 有一个泛型的数据携带体
    • 还可以定义一个方法,用来标识当前对象传递是否出错

    以下是我习惯使用的,仅供参考

    //省略getter和setter等
    public class ApiResult<T> {
    	/**
    	 * 状态标识
    	 */
    	private Integer code;
    	/**
    	 * 携带的信息
    	 */
    	private String msg;
    	/**
    	 * 携带数据体
    	 */
    	private T data;
    	
    	/**
    	 * 是否出错
    	 * @return	true or false
    	 */
    	public boolean isError() {
    		return code != HttpStatus.OK.value();
    	}
    }
    

    由于每次new对象返回,显得不是很优雅,所以我还会使用到一个辅助的生成类,专门用来快速简便的生成响应对象

    public class ApiResultGenerator {
    	
    	private static final Integer OK = 200;
    	
    	private static final Integer SERVER_ERROR = 500;
    	
    	private static final Integer NOT_FOUND = 404;
    	
    	public static ApiResult success() {
    		ApiResult result = new ApiResult();
    		result.setCode(OK);
    		return result;
    	}
    	
    	public static <T> ApiResult<T> success(T data) {
    		ApiResult<T> result = new ApiResult<>();
    		result.setCode(OK);
    		result.setData(data);
    		return result;
    	}
    	
    	public static ApiResult failure() {
    		ApiResult result = new ApiResult();
    		result.setCode(SERVER_ERROR);
    		result.setMsg("server error...");
    		return result;
    	}
    	
    	public static ApiResult failure(String msg) {
    		ApiResult result = new ApiResult();
    		result.setCode(SERVER_ERROR);
    		result.setMsg(msg);
    		return result;
    	}
    	
    	public static <T> ApiResult<T> failure(String msg, T data) {
    		ApiResult<T> result = new ApiResult();
    		result.setCode(SERVER_ERROR);
    		result.setMsg(msg);
    		result.setData(data);
    		return result;
    	}
    	
    	//...自由发挥
    }
    

    既然统一响应对象已经建立了,按照我们的习惯就是开始测试了

    /**
    	 * 返回不携带data的(成功例子)
    	 * @return
    	 */
    	public ApiResult getPaperInfoSuccess() {
    		if (log.isInfoEnabled()) {
    			log.info("收到获取paper信息请求...");
    		}
    		//...业务逻辑
    		if (log.isInfoEnabled()) {
    			log.info("完成获取paper信息请求,准备返回对象信息");
    		}
    		return ApiResultGenerator.success();
    	}
    

    可以注意,这个json对象就是我们跟前端交互的桥梁,通过isError这个方法可以确定接口是否已经出错,这个方法同时可以使用在微服务调用中

    image-20220213232544346

    再测试一个失败的例子

    /**
    	 * 返回携带data的(失败例子)
    	 * @return
    	 */
    @GetMapping("/getStrSF")
    public ApiResult<List<String>> getTestStrFailure() {
        if (log.isInfoEnabled()) {
            log.info("收到获取Str集合请求...");
        }
    
        ApiResult<List<String>> response;
        try {
            response = getStrs();
            //手动模拟一个异常
            int i = 1/0;
        } catch (Exception e) {
            if (log.isErrorEnabled()) {
                log.error("获取Str集合出错");
            }
            return ApiResultGenerator.failure("获取Str集合异常", null);
        }
        if (log.isInfoEnabled()) {
            log.info("完成获取Str集合请求,准备返回对象信息: {}", JSON.toJSONString(response));
        }
        return response;
    }
    

    可以注意到,返回data是null,是因为在返回的时候直接赋值为null了,

    image-20220214071332603

  • 相关阅读:
    通过浏览器,将webp格式图片转jpg格式
    大数据Hadoop之——部署hadoop+hive+Mysql环境(Linux)
    Airtest自定义启动器支持批量运行脚本,并兼容在AirtestIDE中使用
    Linux 安全 - LSM hook点
    【初始RabbitMQ】延迟队列的实现
    Compute通过Conductor访问数据库方法
    开发一个Android应用:从零到一的实践指南
    Vmware Tools最新安装教程(RHEL8)
    ColorFolder文件夹颜色修改工具使用教程
    Win11系统设置闪退的解决方案
  • 原文地址:https://www.cnblogs.com/iamamg97/p/15891159.html