zoukankan      html  css  js  c++  java
  • 【写法规范】-- 设计请求返回接口与封装

    在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);
        }    
  • 相关阅读:
    招银网络
    MYSQL基础
    http中get和post请求的作用和区别
    设计模式
    STL浅析
    云盾态势感知系统检测到您的服务器出现了紧急安全事件:挖矿木马
    SVN服务器搭建详解--权限划分
    MySQL主主复制,mysql主从复制,MySQL+keepalived故障转移。
    Redhat7.0系统利用amoeba对mysql数据进行读写分离的操作,MySQL数据库的主从配置
    源码安装zabbix LNMP源码安装
  • 原文地址:https://www.cnblogs.com/jsyllhb/p/10548169.html
Copyright © 2011-2022 走看看