前言
当涉及到构建Web应用程序时,Spring MVC是一个广泛使用且受欢迎的框架。它提供了一种灵活且功能强大的方式来开发基于MVC模式的Web应用程序。在Spring MVC中,控制器负责处理HTTP请求,并返回适当的响应给客户端。
然而,对于复杂的应用程序,往往需要定义一致的响应格式,以便客户端能够更好地解析和处理响应数据。这就是统一响应格式的重要性所在。
本篇博客将介绍如何在Spring MVC中实现统一的响应格式。我们将探讨如何定义一个标准的响应对象,包含常见的响应字段(如状态码、消息、数据等)。这样做的好处是,客户端无论收到什么类型的响应,都可以按照同一套规则进行解析,从而简化了客户端代码的编写和维护。
通过阅读本文,您将学习到如何在Spring MVC中实现统一响应格式的方法。这将提高您的开发效率,使您能够更好地与前端开发人员协作,构建出高质量、易于维护的Web应用程序。
正题
本文中的代码是我现在所做项目中所用的,是若依框架中的,本博客只做分享
1. 响应信息主体
/**
* 响应信息主体
*
* @author xiaoli
*/
@Data
@NoArgsConstructor
@ApiModel("请求响应对象")
public class R<T> implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 成功
*/
public static final int SUCCESS = 200;
/**
* 失败
*/
public static final int FAIL = 500;
@ApiModelProperty("消息状态码")
private int code;
@ApiModelProperty("消息内容")
private String msg;
@ApiModelProperty("数据对象")
private T data;
public static <T> R<T> ok() {
return restResult(null, SUCCESS, "操作成功");
}
public static <T> R<T> ok(T data) {
return restResult(data, SUCCESS, "操作成功");
}
public static <T> R<T> ok(String msg) {
return restResult(null, SUCCESS, msg);
}
public static <T> R<T> ok(String msg, T data) {
return restResult(data, SUCCESS, msg);
}
public static <T> R<T> fail() {
return restResult(null, FAIL, "操作失败");
}
public static <T> R<T> fail(String msg) {
return restResult(null, FAIL, msg);
}
public static <T> R<T> fail(T data) {
return restResult(data, FAIL, "操作失败");
}
public static <T> R<T> fail(String msg, T data) {
return restResult(data, FAIL, msg);
}
public static <T> R<T> fail(int code, String msg) {
return restResult(null, code, msg);
}
private static <T> R<T> restResult(T data, int code, String msg) {
R<T> r = new R<>();
r.setCode(code);
r.setData(data);
r.setMsg(msg);
return r;
}
}
2. web层通用数据处理
/**
* web层通用数据处理
*
* @author xiaoli
*/
public class BaseController {
/**
* 响应返回结果
*
* @param rows 影响行数
* @return 操作结果
*/
protected R<Void> toAjax(int rows) {
return rows > 0 ? R.ok() : R.fail();
}
/**
* 响应返回结果
*
* @param result 结果
* @return 操作结果
*/
protected R<Void> toAjax(boolean result) {
return result ? R.ok() : R.fail();
}
/**
* 页面跳转
*/
public String redirect(String url) {
return StringUtils.format("redirect:{}", url);
}
/**
* 获取用户缓存信息
*/
public LoginUser getLoginUser() {
return LoginHelper.getLoginUser();
}
/**
* 获取登录用户id
*/
public Long getUserId() {
return LoginHelper.getUserId();
}
/**
* 获取登录部门id
*/
public Long getDeptId() {
return LoginHelper.getDeptId();
}
/**
* 获取登录用户名
*/
public String getUsername() {
return LoginHelper.getUsername();
}
}
3. 示例代码(代码只是作结构参考用,具体根据业务而定)
/**
* @author xiaoli
* @since 2023/12/4 19:38
*/
public class TestController {
@Autowired
private TestService testService;
@ApiOperation("新增")
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody Test test) {
return toAjax(testService.insertByTest(test) ? 1 : 0);
}
@ApiOperation("根据id获取详细信息")
@GetMapping("/{id}")
public R<Test> getInfo(@ApiParam("主键")
@NotNull(message = "主键不能为空")
@PathVariable("id") Long id) {
return R.ok(testService.queryById(id));
}