springboot 定义统一返回结果

2022-09-01 12:29:56

前后端分离项目中后端开发需要写相应的接口,定义统一的返回格式有利于提高开发效率和沟通的成本。通常返回的格式主要如下两种:
1.    只返回相应的状态,格式如下:

{
    "code": "200",
    "msg": "SUCCESS"
}

 2.    返回相应的状态及数据,格式如下:

{
    "code": "200",
    "msg": "查询成功",
    "result": {
        "id": 10,
        "name": "张三",
        "emil": "1234456@qq.com",
        "phone": null,
        "address": "测试地址"
    }
}

 状态代码定义如下:
   code : 请求处理状态

  •       200: 请求处理成功
  •       400: 请求处理失败
  •       500: 服务器内部错误
  •       401未认证(签名错误)
  •       404接口不存在

Springboot中我们可以使用泛型来定义统一的返回结果:
1. 先定义只返回状态的Result

package com.example.demo.base;

import com.alibaba.fastjson.JSON;

public class Result {
    private String code;
    private String msg;

    public String getCode() {
        return code;
    }

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

    public String getMsg() {
        return msg;
    }

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

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}

定义即有数据又有返回状态的DateResult

package com.example.demo.base;

import java.io.Serializable;

public class DateResult<T> extends Result implements Serializable {
    private T result;

    public T getResult() {
        return (T) result;
    }

    public void setResult(T result) {
        this.result = result;
    }

}

定义响应码枚举

package com.example.demo.base;

/**
 * 响应码枚举
 */
public enum ResultCode {
    SUCCESS("200"), //成功
    FAIL("400"), //失败
    UNAUTHORIZED("401"), //未认证(签名错误)
    NOT_FOUND("404"), //接口不存在
    INTERNAL_SERVER_ERROR("500");//服务器内部错误

    private final String code;

    ResultCode(String code) {
        this.code = code;
    }

    public String code() {
        return code;
    }
}

 在Controller类中使用方法如下:

package com.example.demo.controller;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.base.DateResult;
import com.example.demo.base.Result;
import com.example.demo.base.ResultCode;
import com.example.demo.entity.User;

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping("/update")
    public Result updateUser(@RequestParam Integer id) {
        Result result = new Result();
        //相应的逻辑更新逻辑......... 假如更新成功
        result.setCode(ResultCode.SUCCESS.code());
        result.setMsg("更新成功");
        return result;
    }

    @RequestMapping("/detail")
    public DateResult<User> queryUser(@RequestParam Integer id) {
        User user = new User();
        user.setId(10);
        user.setName("张三");
        user.setEmil("1234456@qq.com");
        user.setAddress("测试地址");
        DateResult<User> dateResult = new DateResult<User>();
        dateResult.setCode(ResultCode.SUCCESS.code());
        dateResult.setMsg("查询成功");
        dateResult.setResult(user);
        return dateResult;
    }
}

实体类User代码如下:

package com.example.demo.entity;

import java.io.Serializable;

import com.alibaba.fastjson.JSON;

public class User implements Serializable {
    private Integer id;
    private String  name;
    private String  emil;
    private String  phone;
    private String  address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmil() {
        return emil;
    }

    public void setEmil(String emil) {
        this.emil = emil;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}

先测试没有数据的返回格式,测试结果如下:

无数据的返回格式

测试有返回数据的格式,测试结果如下:

如上的返回结果,我们需要在controller类中每次都需要new一个返回对象比较麻烦,我们可以新建一个ResultUtil

package com.example.demo.base;

/**
 * 响应结果生成工具
 */
public class ResultUtil {
    private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";

    public static Result genSuccessResult() {

        Result result = new Result();
        result.setCode(ResultCode.SUCCESS.code());
        result.setMsg(DEFAULT_SUCCESS_MESSAGE);
        return result;
    }

    public static <T> DateResult<T> genSuccessResult(T data) {
        DateResult<T> dateResult = new DateResult<T>();
        dateResult.setCode(ResultCode.SUCCESS.code());
        dateResult.setMsg(DEFAULT_SUCCESS_MESSAGE);
        dateResult.setResult(data);
        return dateResult;
    }

}

 controller 类的代码修改如下:

package com.example.demo.controller;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.base.DateResult;
import com.example.demo.base.Result;
import com.example.demo.base.ResultUtil;
import com.example.demo.entity.User;

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping("/update")
    public Result updateUser(@RequestParam Integer id) {

        return ResultUtil.genSuccessResult();
    }

    @RequestMapping("/detail")
    public DateResult<User> queryUser(@RequestParam Integer id) {
        User user = new User();
        user.setId(10);
        user.setName("张三");
        user.setEmil("1234456@qq.com");
        user.setAddress("测试地址");
        return ResultUtil.genSuccessResult(user);
    }
}
  • 作者:FighterLiu
  • 原文链接:https://blog.csdn.net/xinghui_liu/article/details/108386024
    更新时间:2022-09-01 12:29:56