这一篇讲后端怎么规范响应真正正式格式的数据给回前端,以及原理
一、@RestController和@ResponseBody是什么?
1、@RestController是啥
前面《后端之路第二站(正片)——SprintBoot-CSDN博客》我这一篇讲过,要在一个【请求处理类】开头声明一个“注解”:【@RestController】
但是没有详细讲这到底是啥玩意,点击它的源码我们可以看到
它是由多个【@...】这样的注解组合成的,先不用管别的,重点看下图红色这两个注解:【@Controller】、【@ResponseBody】
【@Controller】是请求,以我粗糙的见解暂时可以理解为“axios、reques”这样的玩意
【@ResponseBody】是把对象转化成JSON格式响应回给前端
那么通俗地讲,【RestController】就是:
1、作用于【Contoller请求类、请求方法】位置上的
2、将【return的内容】响应显示在前端的玩意
3、就是【@ResponseBody】+【@Controller】结合体,写了它,就自动包含这两
2、@ResponseBody是啥
简单一句话:
它能把后端return的【对象】数据转化成【JSON格式】,再传回给前端显示
也能把前端传过来的【json】数据转化成【对象格式】,给到后端
看到了应该不少前端转后端的要骂娘了,我上一篇《后端之路第二站(正片)——SprintBoot之:设置请求接口-CSDN博客文章浏览阅读165次,点赞5次,收藏8次。目前的企业都是采用前后端分离开发的,在开发阶段前后端需要统一发送请求的接口,前端也需要在等待后端把数据存到数据库之前,自己也要有一些数据用来测试前端页面的,那么这时就需要一个前后端开发合作的接口软件黑马视频李推荐的是postman,但是我不建议,我强烈推荐Apifox!!第一、他是中文的,别的是英文的第二、操作方便,基本很多企业、团队都在用下载很简单,应用商店、官网都可以下载安装。https://blog.csdn.net/m0_73991249/article/details/138960594?spm=1001.2014.3001.5501讲的什么Bull shit,当时我文章里,显示的后端返回给前端的数据格式都是这样:
做过项目的都知道,人家正常后端返回的都是这样JSON格式的
那么莫急,那一篇的目的只是为了讲怎么传各种类型的参数,这里就正式讲怎么才能把数据以这种~ 正式的JSON格式返回前端:
1、用@ResponseBody!!当然我们前面学了@RestController是包含它的,那么写一个【@RestController】在开头就够了
2、最重要,最简单的一步,只要后端return过去的数据是【对象】或者【包含对象的数组、集合】,【@RestController】里的【@ResponseBody】就会自动检测到对象数据,然后把数据转化成JSON格式
~ 前端json格式转化成对象给后端:
如果是前端传过来的是json格式数据,我们后端要转化成对象,就不能用【@RestController】了,直接用【@ResponseBody】
二、return【对象、包含对象的数组、包含对象的集合】
1、对象
2、包含对象的数组
3、包含对象的集合
现在各位前端兄弟看得舒服了吧
三、规范更正规的格式
但是看完上面的数据返回格式,还有很多前端兄弟还是看得不爽:人家正式格式不还得有个“code”、“msg”、“data”的吗?你这啥玩意
那么这里我们再进一步规范格式
那么怎么弄,很简单:
1、创建一个Result类,这个类就是以后所有请求return给前端的规范对象数据
跟一个标准JavaBean类基本一样
不过注意一点!!!
要把data这个变量设为【Object】类型!!!
因为在Java中,Object类是所有类继承的根类,这意味着所有的类都是Object类的子类,包括所有的数组和集合类型,如List、Map、Set等。因此,当在一个Result类中将data字段的类型设置为Object时,实际上是在允许这个字段可以成为任何类型。
不过多加这么几个方法,是为了方便我们在【请求成功、失败】的时候返回整个Result对象数据时,更简便
完整Result类的代码:
public class Result {
private Integer code; //响应代码,暂定1是请求成功,0是请求失败
private String msg; //对应请求成功或者失败的,成功就返回“成功提示”,失败就返回“失败提示”
private Object data; //封装要返回前端的整个数据,必须是【对象】形式或者是【包含对象】的【数组、集合】!!
public Result(Integer code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public Result() {
}
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;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public static Result sucess(Object data){
return new Result(1,"sucess(请求成功,并有返回数据)",data);
}
public static Result sucess(){
return new Result(1,"sucess(请求成功,但无返回数据)",null);
}
public static Result error(String msg){
return new Result(0,msg,null);
}
@Override
public String toString() {
return "Result{" +
"code=" + code +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
2、在请求类里写return为Result的请求方法
现在我们在所有请求接口里,return的全部都是【Result】这个对象,我们只需要把【Result.data】这部分设置成我们的要传的【正式数据】就行了
(比如下面这个例子,【user】就是【Result.data】)
然后因为前面我们给Result类设置了一个静态方法【success方法】,所以其实我们并不用完整“Result(code,msg,data)”这样设置值,可以直接调用【success方法】,传一个【Result.data】值就够了
而且因为【success方法】是static静态方法,在调用的时候直接【类名.方法】就行了
传数组、集合都可以