• springboot统一ajax返回数据格式,并且jquery ajax success函数修改


    服务端代码:

    package com.zhqn.sc.cfg;
    
    
    import org.springframework.core.MethodParameter;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.MediaType;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.http.converter.StringHttpMessageConverter;
    import org.springframework.http.server.ServerHttpRequest;
    import org.springframework.http.server.ServerHttpResponse;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
    
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.zhqn.sc.entity.dto.ErrorModal;
    import com.zhqn.sc.entity.dto.ResponseInfo;
    import com.zhqn.sc.entity.dto.ScException;
    
    @ControllerAdvice
    public class ScResponseAdvise implements ResponseBodyAdvice<Object>{
    
    	@Override
    	public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
    		return true;
    	}
    
    	@Override
    	public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
    			Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
    			ServerHttpResponse response) {
    		ResponseInfo responseInfo = new ResponseInfo();
    		if(body instanceof ErrorModal) {
    			responseInfo.setSuccess(false);
    		}else {
    			responseInfo.setSuccess(true);
    		}
    		responseInfo.setData(body);
    		if(selectedConverterType.equals(StringHttpMessageConverter.class)) {
    			return handleString(responseInfo, response);
    		}
    		return responseInfo;
    	}
    
    	Object handleString(ResponseInfo responseInfo, ServerHttpResponse response) {
    		ObjectMapper mapper = new ObjectMapper();
    		response.getHeaders().add(HttpHeaders.CONTENT_TYPE, "application/json;charset=UTF-8");
    		try {
    			return mapper.writeValueAsString(responseInfo);
    		} catch (JsonProcessingException e) {
    			e.printStackTrace();
    			ScException.error(e.getMessage());
    		}
    		return  null;
    	}
    
    }
    

      

      

    package com.zhqn.sc.entity.dto;
    
    public class ResponseInfo {
    
        private boolean success;
        
        private Object data;
    
        public boolean isSuccess() {
            return success;
        }
    
        public void setSuccess(boolean success) {
            this.success = success;
        }
    
        public Object getData() {
            return data;
        }
    
        public void setData(Object data) {
            this.data = data;
        }
        
    }
    package com.zhqn.sc.entity.dto;
    
    import java.util.Date;
    
    public class ErrorModal {
    
        private Date date;
        
        private Integer code;
        
        private String errorStr;
    
        public Integer getCode() {
            return code;
        }
    
        public void setCode(Integer code) {
            this.code = code;
        }
    
        public String getErrorStr() {
            return errorStr;
        }
    
        public void setErrorStr(String errorStr) {
            this.errorStr = errorStr;
        }
    
        public Date getDate() {
            return date;
        }
    
        public void setDate(Date date) {
            this.date = date;
        }
        
    }

    返回的数据格式是

    {success : true , data : ResponseInfo}代表没有异常时的数据,

    {success : false , data : ErrorModal}代表异常时的数据,有全局异常处理器处理返回的,这一步可以参考网上的教程。

    这一切看似很完美,但是不管发生不发生异常,response的status都是200,前端jquery ajax函数都走的是success方法,这个函数设计初衷就是处理成功时的数据,失败应该走error方法,因此需要修改jquery ajax方法,可以用js aop思路处理,代码如下:

    (function(win){
        var ajax = $.ajax;
        $.ajax = function(a) {
            var oldSuccess = a && a.success && (typeof a.success == "function") ? a.success : null;
            var oldError = a && a.error && (typeof a.error == "function") ? a.error : null;
            var success = function(response) {
                if(response && "data" in response && "success" in response) {
                    var res = response;
                    arguments[0] = response.data;
                    if(res.success == true) {
                        oldSuccess && oldSuccess.apply(this, arguments);
                    }else if(oldError){
                        oldError.apply(this, arguments);
                    }else {
                        alertError(res.data);
                    }
                    
                }else {
                    arguments[0] = {errorStr : "数据格式错误!"};
                }
            };
            var error = function(data) {
                alertError(data);
            }
            if(a) {
                a.success = success;
                a.error = error;
            }else {
                arguments[0] = {
                    success : success,
                    error : error
                };
            }
            ajax.apply(this, arguments);
        }
        function alertError(data) {
            if("status" in data && data.status == 403) {
                return;
            }
            alert(data.errorStr || data.responseJSON && data.responseJSON.errorStr || data.responseText || "服务器连接失败");
        }
        $(document).ajaxError(function(event,xhr,options,exc){
            if(xhr.status == 403 && xhr.getResponseHeader("redirectUrl")) {
                window.top.location.href = xhr.getResponseHeader("redirectUrl");
            }
        });
    })(window);

    只要引入这段代码,原先的success,error都可以正常使用,另外$.get,$.post,$.getJSON,$.getScript都不会有问题,因为它们最后都要调用$.ajax。

  • 相关阅读:
    数据结构与算法题目集(中文)6-12 二叉搜索树的操作集 (30分)
    性能测试案例
    jmeter 常用监听器
    性能测试面试题
    jmeter 之 dubbo
    jmeter5 分布式测试,未成功
    jmeter之OPMS项目管理参数化与断言实战;
    jmeter时间戳处理相关
    jmeter控制器下遍历一组参数
    The Wall (medium)
  • 原文地址:https://www.cnblogs.com/zhouquan-1992-04-06/p/11513025.html
Copyright © 2020-2023  润新知