在前后端分离的项目中,后端除了开发自己的部分还要回传数据到前端,这里推荐一种返回结果工具类,在组件之间进行Http调用或RPC调用时,约定标准的返回对象,便于统一对结果集进行处理。
示例
1.BaseCode基础状态码枚举类
public enum BaseCode {
/**
* 表示请求成功完成,并返回响应数据
*/
SUCCESS("2000", "SUCCESS"),
/**
* 表示成功创建了资源,并返回响应数据
*/
CREATED("2001", "CREATED"),
/**
* 表示成功更新了数据,并返回响应数据
*/
UPDATED("2002", "UPDATED"),
/**
* 表示成功处理了请求,但没有返回响应数据
*/
NO_CONTENT("2004", "NO_CONTENT"),
/**
* 表示成功上传了文件,并返回响应数据
*/
UPLOADED("2005", "UPLOADED"),
/**
* 表示成功下载了文件,并返回响应数据
*/
DOWNLOADED("2006", "DOWNLOADED"),
/**
* 表示客户端发出了错误的请求,例如请求参数错误或缺失
*/
BAD_REQUEST("4000", "BAD_REQUEST"),
/**
* 表示未经授权,需要进行身份验证
*/
UNAUTHORIZED("4001", "UNAUTHORIZED"),
/**
* 表示禁止访问,请求被拒绝
*/
FORBIDDEN("4003", "FORBIDDEN"),
/**
* 表示请求的资源不存在
*/
NOT_FOUND("4004", "NOT_FOUND"),
/**
* 表示请求重复
*/
DUPLICATE_REQUEST("4005", "DUPLICATE_REQUEST"),
/**
* 不被允许的上传文件格式
*/
NOT_ALLOWED_FILE_FORMAT("4006", "NOT_ALLOWED_FILE_FORMAT"),
/**
* 表示用户名或密码错误
*/
USERNAME_PASSWORD_ERROR("1001", "USERNAME_PASSWORD_ERROR"),
/**
* 表示权限不足,无法执行请求的操作
*/
INSUFFICIENT_PERMISSIONS("1002", "INSUFFICIENT_PERMISSIONS"),
/**
* 表示请求的资源已存在
*/
RESOURCE_ALREADY_EXISTS("1003", "RESOURCE_ALREADY_EXISTS"),
/**
* 表示服务器处理异常
*/
SERVER_INTERNAL_ERROR("5000", "SERVER_INTERNAL_ERROR");
private final String code;
private final String message;
BaseCode(String code, String message) {
this.code = code;
this.message = message;
}
public String getCode() {
return code;
}
public String getMessage() {
return message;
}
public static String getMessageByCode(String code) {
for (BaseCode baseCode : BaseCode.values()) {
if (baseCode.code.equals(code)) {
return baseCode.message;
}
}
return null;
}
}
2.BaseResult返回结果类
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@NoArgsConstructor
public class BaseResult<E> implements Serializable {
//实现序列化接口,标识此类可以被序列化
private Boolean success;
private String code;
private String msg;
private E data;
//不同可选参数的构造方法
public BaseResult(Boolean success, String code, String msg) {
this.success = success;
this.code = code;
this.msg = msg;
}
public BaseResult(Boolean success, String code, String msg, E data) {
this.success = success;
this.code = code;
this.msg = msg;
this.data = data;
}
//不带参数的静态方法,通过类名直接调用
public static <T> BaseResult<T> success() {
return new BaseResult<>(true, BaseCode.SUCCESS.getCode(), BaseCode.SUCCESS.getMessage());
}
//带不同参数的静态方法,根据接口返回值的要求自行选择
//实例:return BaseResult.success(...);
public static <T> BaseResult<T> success(T data) {
return new BaseResult<>(true, data == null ? "2004" : BaseCode.SUCCESS.getCode(), data == null ? BaseCode.getMessageByCode("2004") : BaseCode.SUCCESS.getMessage(), data);
}
public static <T> BaseResult<T> success(String code, String message, T data) {
return new BaseResult<>(true, code, message, data);
}
public static <T> BaseResult<T> success(String code, String message) {
return new BaseResult<>(true, code, message);
}
public static <T> BaseResult<T> fail() {
return new BaseResult<>(false, BaseCode.BAD_REQUEST.getCode(), BaseCode.BAD_REQUEST.getMessage());
}
public static <T> BaseResult<T> fail(String code) {
return new BaseResult<>(false, code, BaseCode.getMessageByCode(code));
}
public static <T> BaseResult<T> fail(String code, String message) {
return new BaseResult<>(false, code, message);
}
public static <T> BaseResult<T> fail(String code, String message, T data) {
return new BaseResult<>(false, code, message, data);
}
public static <T> BaseResult<T> status(String code) {
return new BaseResult<>(true, code, BaseCode.getMessageByCode(code));
}
}
3.暴露接口测试
MessageUtils支持多语言工具类详情可以参考这个
https://blog.csdn.net/TM007_/article/details/134135064
@RestController//当前类交给springboot管理,并且自动对返回值进行转换
@RequestMapping("/hello")
public class UserController{
@GetMapping("/testResult")
public BaseResult testNews(Integer num) {
if(num<0){
return BaseResult.fail("4000",MessageUtils.get("number.not.right"));
}
return BaseResult.success("输入的数是:"+num);
}
}
4.接口测试
返回值编码可以和前端协调一个指定值,来标识返回的各种状态
以上便是全部内容了,欢迎各位小伙伴留言讨论