开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情
正式一点的返回值,或者说约定的返回值
前端拿到后端的数据一般都需要做一个判断,然后再执行相应的操作。
一般是这样:
getusers().then((res)=>{
if (res.code){
...
}else{
...
}
})
res就是后端返回给前端的返回值,这里我们需要用一个res.code判断API是否请求成功,这就表示后端的返回值中至少要有个判断是否成功的属性。
那如果请求成功了,或者请求失败了,总该要有个提示吧?
getusers().then((res)=>{
if (res.code){
console.log(res.msg);
}else{
console.log(res.msg);
}
})
这里的console.log(res.msg);就是提示的消息,可以使用第三方框架中的消息框,做一个弹出提示效果,交互感棒棒的。所以后端返回的内容不光需要判断成功,还需要给出提示消息。
接下去最重要的就是返回的实际内容,因为实际内容有很多,所以我们需要用到范型。我们将这三种结合起来单独封装成一个类,一般可称为R类。
R类
这是前后端一种约定的形式。一般包括:
- code:判断请求是否成功
- msg:后端发送给前端的消息,可以发送错误消息给前端,前端对用户做友好的提示
- data:数据
下面是使用Java定义的R类
/**
* 通用的返回结果
* @param <T>
*/
@Data
public class R<T> implements Serializable {
private Boolean code; //编码:True成功,Flase为失败
private String msg; //错误信息
private T data; //数据
}
这里需要思考一下,执行Controller后从底层拿到数据后我需要怎么封装这个R类?
- 我需要传入实际的数据
- 我需要告知通知给前端的消息
Ok,这就表示我们需要定义的方法是这样的,参数是:消息和实际值;等等,调用失败是不是不用实际的返回值,所以success和error还有点点不一样,一个是包含返回值和消息(成功),一个不需要返回值,只需要消息(失败)。
/**
* 通用的返回结果
* @param <T>
*/
@Data
public class R<T> implements Serializable {
private Boolean code; //编码:True成功,Flase为失败
private String msg; //错误信息
private T data; //数据
public static <T> R<T> error(String msg) {
R<T> r = new R<T>();
r.msg = msg;
r.code = false;
return r;
}
public static <T> R<T> success(T object,String msg) {
R<T> r = new R<T>();
r.data = object;
r.msg = msg;
r.code = true;
return r;
}
}
定义好了通用结果类R,我们就可以编写Controller类了,在Controller中的方法中,将返回值封装到R中,然后做返回,一般用于前后端分离项目,后端只做数据的响应,和RESTful风格API以及@ResponseBody相结合。