在RESTful设计风格中,为了保障前后端的数据交互的顺畅,建议规范数据的返回,并采用固定的数据格式封装。
本文将介绍在SpringBoot中如何将统一化返回格式部分的代码进行封装以简化controller函数对返回格式的处理。
总览
创建 /src/main/java/com.../result
目录,创建三个类:ExceptionMsg, Response,ResponseData。如下图所示:
ExceptionMsg 类
该类用以实现响应的枚举
package com.example.studb.result;
// 实现响应的枚举类
public enum ExceptionMsg {
SUCCESS(0, "success"),
FAILED(-1,"fail");
private ExceptionMsg(int code, String msg) {
this.code = code;
this.msg = msg;
}
private int code;
private String msg;
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
Response 类
该类用于实现返回对象实体。
package com.example.studb.result;
// 实现返回对象实体
public class Response {
/** 返回信息码*/
private int rspCode = 0;
/** 返回信息内容*/
private String rspMsg = "success";
public Response() {
}
public Response(ExceptionMsg msg){
this.rspCode = msg.getCode();
this.rspMsg = msg.getMsg();
}
public Response(int rspCode) {
this.rspCode = rspCode;
this.rspMsg = "";
}
public Response(int rspCode, String rspMsg) {
this.rspCode = rspCode;
this.rspMsg = rspMsg;
}
public int getRspCode() {
return rspCode;
}
public void setRspCode(int rspCode) {
this.rspCode = rspCode;
}
public String getRspMsg() {
return rspMsg;
}
public void setRspMsg(String rspMsg) {
this.rspMsg = rspMsg;
}
@Override
public String toString() {
return "Response{" +
"rspCode='" + rspCode + '\'' +
", rspMsg='" + rspMsg + '\'' +
'}';
}
}
ResponseData 类
该类用于封装返回结果。
package com.example.studb.result;
// 封装返回结果
public class ResponseData extends Response {
private Object data;
public ResponseData(Object data) {
this.data = data;
}
public ResponseData(ExceptionMsg msg) {
super(msg);
}
public ResponseData(int rspCode, String rspMsg) {
super(rspCode, rspMsg);
}
public ResponseData(int rspCode, String rspMsg, Object data) {
super(rspCode, rspMsg);
this.data = data;
}
public ResponseData(ExceptionMsg msg, Object data) {
super(msg);
this.data = data;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
@Override
public String toString() {
return "ResponseData{" +
"data=" + data +
"} " + super.toString();
}
}
使用
假如我有一个controller的类:CourseController
,用来查询数据库中所存储的课程信息,使用courseMapper.queryAll()
即可得到结果,为了将结果发送出去,并包装成统一的返回格式,可以这样做:
@RestController
@RequestMapping("/course")
public class CourseController {
@Autowired
private CourseMapper courseMapper;
@RequestMapping("/query")
public Object queryAll() {
return new ResponseData(ExceptionMsg.SUCCESS, courseMapper.queryAll());
}
}
也就是将需要发送的结果数据放入ResponseData
构造器的第二个参数里,将新创建的对象return出去。
效果
对该controller发送请求后可以得到如下结果:
可以看到查询的结果数据被统一的格式封装了起来。