通用结果类R

407 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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类?

  1. 我需要传入实际的数据
  2. 我需要告知通知给前端的消息

Ok,这就表示我们需要定义的方法是这样的,参数是:消息和实际值;等等,调用失败是不是不用实际的返回值,所以successerror还有点点不一样,一个是包含返回值和消息(成功),一个不需要返回值,只需要消息(失败)。

/**
 * 通用的返回结果
 * @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相结合。