1.4 SpringBoot Web返回结果设定为统一格式

文章目录

    • 1. 统一返回相同格式的内容
      • 设定的统一的返回格式
      • 使用统一的方法返回值来统一格式
      • 测试代码(使用idea HttpClient)
    • 2. 优化
      • 使用ResponseBodyAdvice统一处理返回值
      • 优化后不再需要手工封装返回值

返回目录

1. 统一返回相同格式的内容

设定的统一的返回格式

public class R extends HashMap<String,Object> {
     
    public static String RET_CODE = "code"; // 返回码
    public static String RET_MESSAGE = "msg";//返回码对应的说明
    public static String RET_DATA = "data"; // 返回的数据

    public static R error() {
     
        R r = new R();
        r.put(RET_CODE,1);
        r.put(RET_MESSAGE,"未知异常,请联系管理员");
        return r;
    }

    /**
     * 操作成功返回类
     * @param message 返回的描述
     * @param data  返回的数据
     * @return
     */
    public static R ok(String message,Object data) {
     
        R r = new R();
        r.put(RET_CODE,0);
        r.put(RET_MESSAGE,message);
        if(data!=null){
     
            r.put(RET_DATA,data);
        }
        return r;
    }

    public static R okData(Object data) {
     
        return ok("操作成功",data);
    }

    public static R okMessage(String message) {
     
        return ok(message,null);
    }

    public R put(String key, Object value) {
     
        super.put(key, value);
        return this;
    }
}

使用统一的方法返回值来统一格式

@RestController
@RequestMapping("/hello1")
public class Hello1Controller {
     

    @GetMapping("/t1")
    public R hello1() {
     
        return R.okData("返回成功的处理内容");
    }

    @GetMapping("/t2")
    public R hello2() {
     
        Map<String, Object> retMap = new HashMap<>();
        retMap.put("k1", "v1");
        return R.okData(retMap);
    }
}

测试代码(使用idea HttpClient)

### 1.1 统一方法返回值(返回字符串)
GET {
    {base_url}}/hello1/t1


### 1.2 统一方法返回值(返回对象)
GET {
    {base_url}}/hello1/t2

2. 优化

使用ResponseBodyAdvice统一处理返回值

@RestControllerAdvice(basePackages = {
     "com.github.zq84.demo.web"}) // 注意,这里需要添加扫描的包
public class WebResponseHandle implements ResponseBodyAdvice<Object> {
     
    private static final Logger log = LoggerFactory.getLogger(WebResponseHandle.class);

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> aClass) {
     
        // 如果接口返回的类型本身就是R那就没有必要进行额外的操作,返回false
        return !returnType.getParameterType().equals(R.class);
    }
    
    private static ObjectMapper objectMapper = new ObjectMapper();
    @Override
    public Object beforeBodyWrite(Object objData, MethodParameter returnType, MediaType mediaType, Class<?
            extends HttpMessageConverter<?>> aClass, ServerHttpRequest request, ServerHttpResponse response) {
     
        // 返回类型为json,所以String类型不能直接封装,需要进行特殊处理
        if (String.class.equals(returnType.getGenericParameterType())) {
     
            // 如果返回String,那么肯定是retMessage
            try {
     
                return objectMapper.writeValueAsString(R.okData(objData));
            } catch (JsonProcessingException e) {
     
                e.printStackTrace();
            }
        }
        /* 如果使用封装类R,那么说明,需要重写处理成功的提示 */
        R r = R.okData(objData);
        if (objData instanceof R) {
     
            r = (R) objData;
        }
        // 将原本的数据包装在JsonOut中
        return r;
    }
}

优化后不再需要手工封装返回值

@RestController
@RequestMapping("/hello2")
public class Hello2Controller {
     

    @GetMapping("/t1")
    public String hello1() {
     
        return "hello world";
    }

    @GetMapping("/t2")
    public Map<String, Object> hello2() {
     
        Map<String, Object> retMap = new HashMap<>();
        retMap.put("k1", "v1");
        return retMap;
    }
}

优化前后返回内容无区别。

代码地址:https://gitee.com/johnny/learn-demo/tree/master/springboot-demo/boot01-04-common-return

你可能感兴趣的:(spring练习簿)