• SpringBoot统一返回结果


    SpringBoot统一返回结果
    在实际开发中,为了降低开发人员之间的沟通成本,一般返回结果会定义成一个统一格式,具体的格式根据实际开发业务不同有所区别,但至少包括三要素:

    code状态码:由后端统一定义各种返回结果的状态码
    message 描述:本次接口调用的结果描述
    data 数据:本次返回的数据。
    {
    "code": 200,
    "msg": "操作成功",
    "data": "Hello World,test123",

    1 基础实现方式
    1.1 定义状态码
    public enum ReturnCode {
    RC200(200, "操作成功"),
    RC500(500, "操作失败");

    // 自定义状态码
    private final int code;

    // 自定义描述
    private final String msg;

    ReturnCode(int code, String msg){
    this.code = code;
    this.msg = msg;
    }

    public int getCode() {
    return code;
    }

    public String getMsg() {
    return msg;
    }

    1.2 定义返回对象
    @Data
    public class ResultData<T> {

    // 结果状态码
    private int code;

    // 响应信息
    private String msg;

    // 响应数据
    private T data;

    // 接口请求时间
    private long timestamp ;

    public ResultData (){
    this.timestamp = System.currentTimeMillis();
    }

    public static <T> ResultData<T> success(T data){
    ResultData resultData = new ResultData();
    resultData.setCode(ReturnCode.RC200.getCode());
    resultData.setMsg(ReturnCode.RC200.getMsg());
    resultData.setData(data);
    return resultData;
    }

    public static <T> ResultData<T> fail(int code, String msg){
    ResultData resultData = new ResultData();
    resultData.setCode(code);
    resultData.setMsg(msg);
    return resultData;
    }

    1.3 统一返回格式
    @GetMapping("/getTest")
    public ResultData<String> getTest(){
    return ResultData.success("Hello world!");

    返回结果如下所示:

    {
    "code": 200,
    "msg": "操作成功",
    "data": "Hello world!",
    "timestamp": 1639013414924

    到这里,一个统一格式的返回结果已经实现,接口的返回类型为ResultData,但每写一个接口,就要调用ResultData.success()对结果进行包装,重复劳动,浪费体力,所以这个在实际工作中一般用的比较少。

    2 高级实现方式
    我们只需要借助SpringBoot 提供的ResponseBodyAdvice即可。

    **ResponseBodyAdvice的作用:**拦截Controller方法的返回值,统一处理返回值/响应体,一般用来统一返回格式,加解密,签名等等。

    2.1 ResponseBodyAdvice返回
    @RestControllerAdvice(basePackages = "com.asxy.demo")
    public class ResponseAdvice implements ResponseBodyAdvice {

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
    return true;
    }

    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {

    if(body instanceof String){ // 如果Controller直接返回String的话,SpringBoot是直接返回,故我们需要手动转换成json。
    return objectMapper.writeValueAsString(ResultData.success(body));
    }
    if(body instanceof ResultData){ // 如果返回的结果是ResultData对象,直接返回即可。
    return body;
    }
    return ResultData.success(body);
    }

    2.2 全局异常处理器
    @Slf4j
    @RestControllerAdvice
    public class RestExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ResultData<String> exception(Exception e){
    log.error("全局异常信息 ex={}", e.getMessage(), e);
    return ResultData.fail(ReturnCode.RC500.getCode(), e.getMessage());
    }

    @RestControllerAdvice,RestController的增强类,可用于实现全局异常处理器
    @ExceptionHandler,统一处理某一类异常,从而减少代码重复率和复杂度,比如要获取自定义异常可以 @ExceptionHandler(BusinessException.class)
    @ResponseStatus指定客户端收到的http状态码
    2.3 体验效果
    @GetMapping("/wrong")
    public int error(){
    int i = 9/0;
    return i;

    返回结果如下:

    {
    "code": 500,
    "msg": "/ by zero",
    "data": null,
    "timestamp": 1639014045820
    }
    ————————————————
    版权声明:本文为CSDN博主「蠢死的脑细胞」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/asxyxxx/article/details/121806762

  • 相关阅读:
    react-document-title
    react-router
    redux-saga 异步流
    redux
    redux-thunk
    react-router-redux
    [翻译] ClockView 时钟
    [翻译] MZTimerLabel 用作秒表或者倒计时
    [翻译] MCProgressView 使用自定义图片做进度显示
    [翻译] ADPopupView 触摸弹出视窗
  • 原文地址:https://www.cnblogs.com/javalinux/p/16264076.html
Copyright © 2020-2023  润新知