文章目录
- 表现层数据封装
- 数据返回格式
- 数据封装
表现层数据封装
数据返回格式
表现层数据封装是什么意思呢? 我们根据目前做的增删改查功能来看看目前返回数据的格式存在哪些问题
增删改的数据返回格式如下:
true
查询单条数据的返回格式如下:
{
"id": 1,
"type": "计算机理论",
"name": "Spring实战 第5版",
"description": "Spring入门经典教程"
}
查询全部数据的返回格式如下:
[
{
"id": 1,
"type": "计算机理论",
"name": "Spring实战 第5版",
"description": "Spring入门经典教程"
},
{
"id": 2,
"type": "计算机理论",
"name": "Spring 5核心原理与30个类手写实战",
"description": "十年沉淀之作"
}
]
可以发现, 目前增删改的操作返回的数据是一个布尔值, 查询单条返回的是一个对象, 查询全部返回的又是一个数组; 那么前端人员在进行不同的操作时就需要用不同的数据类型接收
因此我们需要对数据整合, 返回一个统一的数据格式给前端人员; 于是我们就统一了一个前端接收数据的格式: 创建结果模型类,封装数据到data属性中
增删改的数据统一格式后如下:
{
"data":true
}
查询单个数据统一格式后如下:
{
"data":{
"id": 1,
"type": "计算机理论",
"name": "Spring实战 第5版",
"description": "Spring入门经典教程"
}
}
查询全部数据统一格式后如下:
{
"data":[
{
"id": 1,
"type": "计算机理论",
"name": "Spring实战 第5版",
"description": "Spring入门经典教程"
},
{
"id": 2,
"type": "计算机理论",
"name": "Spring 5核心原理与30个类手写实战",
"description": "十年沉淀之作"
}
]
}
但是目前又存在一个新的问题: 增删改的操作返回的数据都是一样的, 那么前端拿到数据后如何区分这个操作是添加还是删除或者是修改呢?
针对区分数据, 我们在模型类中新增一个code属性, 将操作结果封装到code属性中
例如后端和前端约定好:
- 20011代表新增操作
- 20021代表删除操作
- 20031代表修改操作
- data中的属性为true就是删除成功, 为false就删除失败
{
"code": 20011,
"data": false
}
{
"code": 20021,
"data": true
}
{
"code": 20031,
"data": true
}
我们查询的操作也是需要与前端约定好一个数字代表, 例如20041; 查询单个和查询全部都是20041
{
"code": 20041,
"data":{
"id": 1,
"type": "计算机理论",
"name": "Spring实战 第5版",
"description": "Spring入门经典教程"
}
}
{
"code": 20041,
"data":[
{
"id": 1,
"type": "计算机理论",
"name": "Spring实战 第5版",
"description": "Spring入门经典教程"
},
{
"id": 2,
"type": "计算机理论",
"name": "Spring 5核心原理与30个类手写实战",
"description": "十年沉淀之作"
}
]
}
如果此时前端查询了一条不存在的数据, 一定是下面这样的返回结果, 那么这个20041是代表成功还是失败呢?
此时前端人员是不知道的, 还需要将data中的属性取出来才知道
{
"code": 20041,
"data":null
}
此时又有新的约定, 最后一位只要是0那么就代表查询失败, 我们使用20040代表查询失败; 前端知道查询失败后就不会再去data属性中取数据
{
"code": 20040,
"data": null,
}
查询失败后, 我们需要封装特殊消息到message(msg)属性中, 例如返回一句文本提示查询失败; 到这里模型类的最终形式就确定下来了
目前, 前端人员在查询结果为20041时, 去data中取数据, 查询结果为20040时, 将msg中的提示信息展示出来;
{
"code": 20040,
"data": null,
"msg": "数据查询失败,请重试!"
}
数据封装
我们需要定义一个模型类, 例如Result, 统一数据的返回结果
模型类我们一般定义在controller包下
public class Result {
private Object data;
private Integer code;
private String msg;
}
注意:
Result类中的字段并不是固定的,可以根据需要自行增减
也可以提供若干个构造方法,方便操作
public class Result {
private Object data;
private Integer code;
private String msg;
public Result() {
}
public Result(Integer code, Object data) {
this.data = data;
this.code = code;
}
public Result(Integer code, Object data, String msg) {
this.data = data;
this.code = code;
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
controller包下创建一个Code类, 用于设置统一数据返回结果编码
Code类的常量设计也不是固定的,可以根据需要自行增减,例如将查询再进行细分为SELECT_OK,SELECT_ALL_OK,SELECT_PAGE_OK
public class Code {
public static final Integer SAVE_OK = 20011;
public static final Integer DELETE_OK = 20021;
public static final Integer UPDATE_OK = 20031;
public static final Integer SELECT_OK = 20041;
public static final Integer SAVE_ERR = 20010;
public static final Integer DELETE_ERR = 20020;
public static final Integer UPDATE_ERR = 20030;
public static final Integer SELECT_ERR = 20040;
}
controller包下BookController中的控制器方法就需要发生变化, 返回结果应全部返回Result对象
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private BookService bookService;
@PostMapping
public Result save(@RequestBody Book book) {
boolean flag = bookService.save(book);
return new Result(flag ? Code.SAVE_OK: Code.SAVE_ERR, flag);
}
@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id) {
boolean flag = bookService.delete(id);
return new Result(flag ? Code.DELETE_OK: Code.DELETE_ERR, flag);
}
@PutMapping
public Result update(@RequestBody Book book) {
boolean flag = bookService.update(book);
return new Result(flag ? Code.UPDATE_OK: Code.UPDATE_ERR, flag);
}
@GetMapping
public Result selectAll() {
List<Book> books = bookService.selectAll();
boolean flag = books != null;
Integer code = flag ? Code.SELECT_OK: Code.SELECT_ERR;
String mes = flag ? "": "数据查询失败, 请重试!";
return new Result(code, books, mes) ;
}
@GetMapping("/{id}")
public Result selectById(@PathVariable Integer id) {
Book book = bookService.selectById(id);
boolean flag = book != null;
Integer code = flag ? Code.SELECT_OK: Code.SELECT_ERR;
String msg = flag ? "": "数据查询失败, 请重试!";
return new Result(code, book, msg);
}
}
到这里, 前端发送请求向后端获取的数据就是统一格式了
{
"data": {
"id": 2,
"type": "测试修改",
"name": "测试修改",
"description": "测试修改"
},
"code": 20041,
"msg": ""
}