美文网首页Spring 学习
JavaLib | Result让你的API接口统一化(2)

JavaLib | Result让你的API接口统一化(2)

作者: 冯文议 | 来源:发表于2018-09-02 23:23 被阅读67次

    引言

    JavaLib很早就实现了Result模块,我也一直在用,但那是针对公用API接口的,如果后端开发人员也像那样写API接口给前端的话,非常麻烦,所以,很早就决定要重写了,我也是参考了很多人的,看Spring Builder模式,有点糊涂,设计算是失败了。

    概要

    我们先来看一下,长什么样吧。

    public class App {
    
        public static void main(String[] args) {
    
            // 成功,无数据,自定义返回码和描述
            Result result1 = ResultResponseUtil.ok().code(0).msg("Success");
            // 成功,返回数据,自定义返回码和描述
            Result result2 = ResultResponseUtil.ok().code(0).msg("Success").data("data");
            // 成功,无数据,通过enum方式存放返回码
            Result result3 = ResultResponseUtil.ok().status(DefaultReturnCode.SUCCESS);
            // 成功,返回数据,通过enum方式存放返回码
            Result result4 = ResultResponseUtil.ok().status(DefaultReturnCode.SUCCESS).data("data");
    
            // 失败,无数据,自定义返回码和描述
            Result result5 = ResultResponseUtil.error().code(-1).msg("Error");
            // 失败,返回数据,自定义返回码和描述
            Result result6 = ResultResponseUtil.error().code(-1).msg("Error").data("data");
            // 失败,无数据,通过enum方式存放返回码
            Result result7 = ResultResponseUtil.error().status(DefaultReturnCode.ERROR_INIT);
            // 失败,返回数据,通过enum方式存放返回码
            Result result8 = ResultResponseUtil.error().status(DefaultReturnCode.ERROR_INIT).data("data");
    
            Console.info(result1);
            Console.info(result2);
            Console.info(result3);
            Console.info(result4);
            Console.info(result5);
            Console.info(result6);
            Console.info(result7);
            Console.info(result8);
            Console.info();
            Console.info(new Gson().toJson(result1));
            Console.info(new Gson().toJson(result2));
            Console.info(new Gson().toJson(result3));
            Console.info(new Gson().toJson(result4));
            Console.info(new Gson().toJson(result5));
            Console.info(new Gson().toJson(result6));
            Console.info(new Gson().toJson(result7));
            Console.info(new Gson().toJson(result8));
        }
    }
    

    打印结果:

    DefaultResult{code=0 success=true msg=Success data=null}
    DefaultResult{code=0 success=true msg=Success data=data}
    DefaultResult{code=0 success=true msg=Success data=null}
    DefaultResult{code=0 success=true msg=Success data=data}
    DefaultResult{code=-1 success=false msg=Error data=null}
    DefaultResult{code=-1 success=false msg=Error data=data}
    DefaultResult{code=-1 success=false msg=init... data=null}
    DefaultResult{code=-1 success=false msg=init... data=data}
    
    {"success":true,"code":0,"msg":"Success"}
    {"success":true,"code":0,"msg":"Success","data":"data"}
    {"success":true,"code":0,"msg":"Success"}
    {"success":true,"code":0,"msg":"Success","data":"data"}
    {"success":false,"code":-1,"msg":"Error"}
    {"success":false,"code":-1,"msg":"Error","data":"data"}
    {"success":false,"code":-1,"msg":"init..."}
    {"success":false,"code":-1,"msg":"init...","data":"data"}
    

    使用

    import com.fengwenyi.javalib.result.DefaultReturnCode;
    import com.fengwenyi.javalib.result.Result;
    import com.fengwenyi.javalib.result.ResultResponseUtil;
    import lombok.Data;
    import lombok.experimental.Accessors;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestController
    public class ApiResultApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ApiResultApplication.class, args);
        }
    
        /**
         * 获取所有用户数据
         * @return (json)
         */
        @GetMapping("/getUsers")
        public Result getUsers() {
    
            User user1 = new User().setName("冯文议").setAge(26).setGender("男");
            User user2 = new User().setName("张三").setAge(25).setGender("女");
            User user3 = new User().setName("李四").setAge(23).setGender("保密");
            User user4 = new User().setName("王五").setAge(20).setGender("未知");
    
            User [] users = {user1, user2, user3, user4};
    
            return ResultResponseUtil.ok().status(DefaultReturnCode.SUCCESS).data(users);
    
        }
    }
    
    @Data
    @Accessors(chain = true)
    class User {
    
        // 姓名
        private String name;
        // 年龄
        private Integer age;
        // 性别
        private String gender;
    
    
    }
    

    结果(已格式化):

    {
        "code":0,
        "msg":"Success",
        "data":[
            {
                "name":"冯文议",
                "age":26,
                "gender":"男"
            },
            {
                "name":"张三",
                "age":25,
                "gender":"女"
            },
            {
                "name":"李四",
                "age":23,
                "gender":"保密"
            },
            {
                "name":"王五",
                "age":20,
                "gender":"未知"
            }
        ],
        "success":true
    }
    

    这样存在一个问题,也是上个版本有的,我们修改一下代码:

    //return ResultResponseUtil.ok().status(DefaultReturnCode.SUCCESS).data(users);
    return ResultResponseUtil.ok().code(0).data(users);
    

    看结果:

    API返回值存在null

    API返回值存在 null,相信你一定遇到了这个问题,那我们怎么避免这个问题呢?网上有很多解决办法,我想说的是,我们还是应该按规则来写,写全写完整。

    我们再来看看另外一种处理方式:

        @GetMapping("/getUsers2")
        public String getUsers2() {
    
            User user1 = new User().setName("冯文议").setAge(26).setGender("男");
            User user2 = new User().setName("张三").setAge(25).setGender("女");
            User user3 = new User().setName("李四").setAge(23).setGender("保密");
            User user4 = new User().setName("王五").setAge(20).setGender("未知");
    
            User [] users = {user1, user2, user3, user4};
    
            Result result = ResultResponseUtil
                    .ok()
                    .status(DefaultReturnCode.SUCCESS)
                    .data(users);
            
            return new Gson().toJson(result);
    
        }
    

    写公用接口的时候,我们一定要注意,避免所有的不必要。

    资料

    【1】 JavaLib

    【2】 JavaLib Result模块测试代码

    【3】 SpringMVC返回结果的封装

    【4】 JavaLib | result 模块

    相关文章

      网友评论

        本文标题:JavaLib | Result让你的API接口统一化(2)

        本文链接:https://www.haomeiwen.com/subject/hjdvwftx.html