【写法规范】-- 设计请求返回接口与封装

在web开发时,请求返回一般有两类。一类是数据(一般为json格式),一类是页面。

@GetMapping("/hello")
    public String hello1(){
        //这里使用的thymeleaf,会去找hello.html
        return "hello";
    }
    
    @ResponseBody
    @GetMapping("/hello")
    public String hello2(){
        //直接返回字符串
        return "hello lhb";
    }

这显然不太规范,会给前后端开发人员之间的沟通和协作带来麻烦。

正确的做法是设计规范的接口并进行封装。

服务端返回的数据格式(json)

{
    "code":0
    "msg" :
    "data":{},[]
}

code:代表错误码。具体的错误码是需要自定义的,例如:0代表成功,777代表服务器异常等。

msg:代表错误信息

data:代表成功时的数据,可以是json对象或数组。

{
    "code":777
    "msg" :"服务器异常"
    "data":{}
}

接下来让我们来看一个封装的实例:

Result类:

public class Result<T> {
    private int code;
    private String msg;
    private T data;
    
    /**
     * 请求成功时调用
     * @param data
     * @return
     */
    public static <T> Result<T> success(T data){
        return new Result<T>(data);
    }
    
    public static <T> Result<T> error(CodeMsg cm){
        return new Result<T>(cm);
    }
    
    /**
     * 只传入数据默认成功,所以添加默认的code和msg
     * @param data
     */
    private Result(T data) {
        this.code=0;
        this.msg="success";
        this.data=data;
    }
    
    private Result(CodeMsg cm) {
        if(cm==null){
            return;
        }
        this.code=cm.getCode();
        this.msg=cm.getMsg();
    }
    
    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public T getData() {
        return data;
    }

}
CodeMsg类:
public class CodeMsg {

    private int code;
    private String msg;
    
    //通用的错误码
    public static CodeMsg SUCCESS = new CodeMsg(0, "success");
    public static CodeMsg SERVER_ERROR = new CodeMsg(777, "服务端异常");
   public int getCode() {
        return code;
    }


    public String getMsg() {
        return msg;
    }
    
private CodeMsg(int code,String msg) {
        this.code = code;
        this.msg = msg;
    }

}

为什么要有CodeMsg类?

如果没有CodeMsg类,当我们请求返回成功时,可以直接将数据传入。

@ResponseBody
    @GetMapping("/hello")
    public Result<String> hello(){
        return Result.success("hello");
    }

但是,如果请求失败,需要传递错误信息时,我们必须这么做。

@ResponseBody
    @GetMapping("/helloerror")
    public Result<String> helloError(){
        return Result.error(new CodeMsg(777,"服务器异常"));
    }    

这样不是不可以,只是看起来不太优雅。而且,如果项目非常大,到后期可能连你自己也不知道自己定义了多少错误码,甚至可能重复定义错误码。

如何优化呢?我们只需要在CodeMsg中定义静态的成员变量,并且给它赋上自定义的错误码和错误信息,这样不仅看上去规范了许多,而且所有的错误类型都在一个地方,方便修改和检查。

优化后:

@ResponseBody
    @GetMapping("/helloerror")
    public Result<String> helloError(){
        return Result.error(CodeMsg.SERVER_ERROR);
    }    

 

posted @ 2019-03-18 22:42  健忘的李鸽鸽  阅读(849)  评论(0编辑  收藏  举报