Springboot--定义Rest风格接口统一返回的数据结构

在前后端分离的开发中,开发后端返回的数据往往是在controller层中返回的,一般都是在controller写Restful风格的接口来返回数据。这时候返回的数据格式一般都是json格式,而且返回一般都有一个统一的数据结构形式 即:
{
“code”:…(请求接口返回的码)
“msg”:…(请求接口返回的信息)
“data”:…(一般返回数据,若是不返回就不显示)
}
所以在springboot中需要创建一个自定义的统一返回处理类,来处理全局的输出


先自定义一个统一的返回结果类

1.RetResult.java
@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
public class RetResult<T> {
    private int code;
    private String msg;
    private T data;

    public RetResult(int code,String msg,T data){
        this.code=code;
        this.msg=msg;
        this.data=data;
    }


    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

创建一个常用的code 枚举类型

2.RetCode
public enum RetCode {
    // 成功
    SUCCESS(200),

    // 失败
    FAIL(202),

    // 未认证(签名错误)
    UNAUTHORIZED(401),

    // 接口不存在
    NOT_FOUND(404),

    // 服务器内部错误
    INTERNAL_SERVER_ERROR(500);

    public int code;

    RetCode(int code) {
        this.code = code;
    }
}

自定义一些code,msg,data返回

3.RetResponse.java
public class RetResponse {
    //自定义message 失败信息
    public static <T> RetResult<T> makeErrRsp(String message) {
        return new RetResult<T>(202,message,null);
    }

    //自定义code,msg 返回数据
    public static <T> RetResult<T> makeRsp(int code, String msg) {
        return new RetResult<T>(code,msg,null);
    }
    //自定义code,msg,data 返回数据
    public static <T> RetResult<T> makeRsp(int code, String msg, T data) {
        return new RetResult<T>(code,msg,data);
    }
}

最后创建一个对全局返回输出的结果类的处理类

4.RetResultAdvice.java
@RestControllerAdvice
public class RetResultAdvice implements ResponseBodyAdvice<Object> {

	//需要忽略拦截的类
	
	//这个方法表示对于哪些请求要执行beforeBodyWrite,返回true执行,返回false不执行
    @Override   
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
    	//如果是返回了RetResult类就直接返回不做处理
        if (o instanceof RetResult) {
            return o;
        }
        //如果返回的数据是string类型的时候做的处理	
        if(o instanceof String) {
            return JSON.toJSONString(o);
        }
        return new RetResult(200,"success" , o);
    }
}

controller层创建TestController.java测试
这里返回自己定义的用户测试数据

	@RequestMapping(value = "/select/{openid}",method = RequestMethod.GET)
    @ResponseBody
    public User searchUser(@PathVariable String openid)
    {
        User user=userService.selectByOpenid(openid);
        return user;
    }

结果:
在这里插入图片描述
模拟测试没有返回数据,只执行一些业务

 	@RequestMapping("/test")
    @ResponseBody
    public void test(){
        Random random=new Random();
        int i=random.nextInt(10);
        return;
    }

在这里插入图片描述
测试返回自定义的code,msg:

	@RequestMapping("/test")
    @ResponseBody
    public RetResult test(){
        Random random=new Random();
        int i=random.nextInt(10);
        return RetResponse.makeRsp(208,"自定义msg");
    }

结果:

在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值