文档章节

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

冯文议
 冯文议
发布于 2018/09/02 23:22
字数 979
阅读 53
收藏 2

引言

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 模块

© 著作权归作者所有

冯文议
粉丝 11
博文 47
码字总数 47895
作品 0
成都
高级程序员
私信 提问
实战:基于Spring Boot快速开发RESTful风格API接口

写在前面的话 这篇文章计划是在过年期间完成的,示例代码都写好了,结果亲戚来我家做客,文章没来得及写。已经很久没有更新文章了,小伙伴们,有没有想我啊。言归正传,下面开始,今天的话题...

JAVA_冯文议
02/20
121
0
JavaLib | 使用AOP帮你记录日志

这一次,我们干脆点,直接进入正题。 第一步 使用这个模块,你必要加入的包依赖: 第二步 你需要告诉我,你的切入点(继承 ,并实现 方法,配置你的切入点) 第三步 写一个接口进行测试,我们...

冯文议
2018/09/04
34
0
JavaLib-quartz | 基于Spring Boot Quartz开发的定时任务

基于Spring Boot Quartz开发的JavaLib-quartz,目的是帮你快速构建定时任务系统,你可以专心编写你的业务逻辑,而不必关注定时任务具体是如何实现的,他的性能如何,有没有异常以及异常处理,...

冯文议
2018/07/30
62
0
前端工程化(3):在项目中优雅的设计基于Axios的请求方案

其实axios已经提供了很多很强大的api,我们在实际使用中直接调用就可以,但是每个团队每个项目调用axios的姿势不一样,特别是在一个大型的团队项目中,与后端交互逻辑不同、配置复杂、地址较...

HulkShen
03/31
0
0
jdmvc-1.2.5 发布,简单 MVC 框架

java simple mvc support restful and annotation ,some kind of params will be post in method. 具体例子请查看DEMO。非常简单的MVC。spring mvc精简版。 jdmvc-1.2.5 版本发布,更新内容如......

liubingsmile
2014/05/10
780
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
628
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
32
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
19
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
56
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部