java递归实现拼装多个api的结果操作方法

工作需要,经常需要实现api接口,但每次都是大同小异,我就考虑是否可以将这种重复性的工作配置化。

我就写一个模板api,然后所有的HTTP请求过来,根据不同的配置返回不同结果。

最开始考虑的是比较简单的,来一个api需求,我就去MySQL查一条这个api对应的SQL,然后拿SQL去取结果,返回。

这个不难。

关键是实际需求中,有很多api返回的数据很复杂,比如渲染地图的接口,一般一条SQL搞不定。

那我就想,那我能不能实现api的拼装呢,你看到我只是调用了一个API,但是我给你返回的结果,其实是好几个API结果拼装成的。

经过研究,是可以实现的。

首先我们定义一个ApiConfig的模型

@Data
@Table(name = "api_config")
@AllArgsConstructor
public class ApiConfig implements Serializable {

    @ApiModelProperty("api名称")
    private String apiName;

    @ApiModelProperty("数据源名称")
    private String dsName;

    @ApiModelProperty("SQL")
    private String querySql;

    @ApiModelProperty("结果类型")
    private String resultType;

    @ApiModelProperty("结果描述")
    private String resultDesc;

    @ApiModelProperty("依赖api")
    private String dependApiName;
}

接下来就是我们的实现类,因为是展现可行性,所以我们不分层,在一个Test类中把所有逻辑实现

{"key1":"x/y/1",
"key2":"x/y/2"}

接下来就是我们的实现类,因为是展现可行性,所以我们不分层,在一个Test类中把所有逻辑实现

@Slf4j
public class Test {
    //测试数据的初始化
    public static List<ApiConfig> apiConfigList = new ArrayList<>();
    public static Map<String, String> sqlResultMap = ImmutableMap.of("sql1", "{\"a\":\"1\"}", "sql2", "{\"b\":\"2\"}", "sql3", "{\"c\":\"3\"}");

    static {
        ApiConfig api1 = new ApiConfig("p1", "d1", "sql1", "map", "", "{\"b\":\"p1/x1\"}");
        ApiConfig api2 = new ApiConfig("p1/x1", "d1", "sql2", "map", "", "{\"c\":\"p1/x2\"}");
        ApiConfig api3 = new ApiConfig("p1/x2", "d1", "sql3", "map", "", null);
        apiConfigList.add(api1);
        apiConfigList.add(api2);
        apiConfigList.add(api3);
    }

    /**
     * 我要进行http:ip:port/p1这个请求,请返回我相关数据
     * @param args
     */
    public static void main(String[] args) {
        //根据api名称获取结果
        String apiName = "p1";
        JSONObject json = doGetResult(apiName);
        //result必须初始化,而且在方法内部不能重新new,以保证递归方法内更新的是同一个对象,否则拿不到更新数据后的result
        JSONVO result = null;
        if (json != null) {
            result = new JSONVO(json.toJSONString());
        } else {
            result = new JSONVO("{}");
        }
        //如有需要,递归获取子api的结果,并存入result
        getApiResult(apiName, null, result);
        System.out.println(result);

    }

    /**
     * 从子api查询结果,并更新到主result
     * @param apiName
     * @param dataKey
     * @param result
     */
    public static void getApiResult(String apiName, String dataKey, JSONVO result) {
        //dataKey在进入方法时是等于null的,第二次进入肯定不应该为null,这个地方是更新result的关键位置
        if (dataKey != null) {
            JSONObject json = doGetResult(apiName);
            result.set(dataKey, json);
        }
        //进入递归的入口
        String dependApiName = getApiConfig(apiName).getDependApiName();
        if (dependApiName != null) {
            JSONObject dependApi = JSONObject.parseObject(dependApiName);
            Set<String> keySet = dependApi.keySet();
            for (String key : keySet) {
                String subApi = dependApi.getString(key);
                getApiResult(subApi, key, result);
            }

        }
    }

    public static JSONObject doGetResult(String apiName) {
        String querySql = getApiConfig(apiName).getQuerySql();
        return doQuery(querySql);
    }

    /**
     * 根据api名称获取apiConfig
     *
     * @param api
     * @return
     */
    public static ApiConfig getApiConfig(String api) {
        for (ApiConfig apiConfig : apiConfigList) {
            if (apiConfig.getApiName().equals(api)) {
                return apiConfig;
            }
        }
        log.error("api not exists!");
        return null;
    }

    /**
     * 根据查询SQL获取结果
     *
     * @param sql
     * @return
     */
    public static JSONObject doQuery(String sql) {
        String s = sqlResultMap.get(sql);
        JSONObject jsonObject = JSONObject.parseObject(s);
        return jsonObject;
    }

}

输出结果:

{"a":"1","b":{"b":"2"},"c":{"c":"3"}}

可以看到,两层递归的子api的数据都查出来了。

从数据库返回的结果,可能也不一定是JsonObject,这个在实现项目中需要在具体分析。

到此这篇关于java递归实现拼装多个api的结果的文章就介绍到这了,更多相关java递归拼装内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java新人基础入门之递归调用

    一.递归概念 递归本质:程序调用自身的编程技巧叫做递归. 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调: 用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过: 程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无限集合. 二.递归的三个条件: 边界条件 递归前进段 递归返回段 当

  • Java的递归算法详解

    目录 一.介绍 1.介绍 2.案例 二.迷宫问题 三.八皇后问题 四.汉诺塔问题 1.问题 2.思想 3.代码 总结 一.介绍 1.介绍 递归:递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁. 迭代和递归区别:迭代使用的是循环结构,递归使用的选择结构.使用递归能使程序的结构更清晰.更简洁.更容易让人理解,从而减少读懂代码的时间.其时间复杂度就是递归的次数. 但大量的递归调用会建立函数的副本,会消耗大量的时间和内存,而迭代则不需要此种付出

  • 使用java API实现zip递归压缩和解压文件夹

    一.概述 在本篇文章中,给大家介绍一下如何将文件进行zip压缩以及如何对zip包解压.所有这些都是使用Java提供的核心库java.util.zip来实现的. 二.压缩文件 首先我们来学习一个简单的例子-压缩单个文件.将一个名为test1.txt的文件压缩到一个名为Compressed.zip的zip文件中. public class ZipFile { public static void main(String[] args) throws IOException { //输出压缩包 Fil

  • Java实现简单的递归操作方法实例

    前言 在数据结构算法设计中,或者一个方法的具体实现的时候,有一种方法叫做"递归",这种方法在思想上并不是特别难,但是实现起来还是有一些需要注意的.虽然对于很多递归算法都可以由相应的循环迭代来代替,但是对于一些比较抽象复杂的算法不用递归很难理解与实现. 递归分为直接递归和间接递归,就简单分享一下两个小的直接递归. 对于递归的概念,其实你可以简单的理解为自己定义自己,记得小时候看过一部电视剧<狼毒花>,里面主角叫做"常发",但是个文盲,老师问他叫什么,他说&

  • Java实现递归计算n的阶乘

    本文实例为大家分享了Java实现递归计算n的阶乘的具体代码,供大家参考,具体内容如下 问题描述 利用递归的思想实现阶乘的计算,以 n!为例 (一).n的范围 1.n<0:n!无意义 2.n=0或n=1:n!=1 3.n>2:n!=n(n-1)! 关于 0!=1 的一个合理性解释: 根据阶乘的定义n!=n(n-1)!, 可变形为n=(n+1)!/(n+1), 带入有0=1!/1=1 (二).问题分析 1.n<0时提醒用户输入有误 (1)在未知循环次数时,可以采用while语句来提醒 (2)

  • java递归实现拼装多个api的结果操作方法

    工作需要,经常需要实现api接口,但每次都是大同小异,我就考虑是否可以将这种重复性的工作配置化. 我就写一个模板api,然后所有的HTTP请求过来,根据不同的配置返回不同结果. 最开始考虑的是比较简单的,来一个api需求,我就去MySQL查一条这个api对应的SQL,然后拿SQL去取结果,返回. 这个不难. 关键是实际需求中,有很多api返回的数据很复杂,比如渲染地图的接口,一般一条SQL搞不定. 那我就想,那我能不能实现api的拼装呢,你看到我只是调用了一个API,但是我给你返回的结果,其实是

  • FluentMybatis实现mybatis动态sql拼装和fluent api语法

    目录 开始第一个例子: Hello World 新建演示用的数据库结构 创建数据库表对应的Entity类 运行测试来见证Fluent Mybatis的神奇 配置spring bean定义 使用Junit4和Spring-test来执行测试 开始第一个例子: Hello World 新建Java工程,设置maven依赖 新建maven工程,设置项目编译级别为Java8及以上,引入fluent mybatis依赖包. <dependencies> <!-- 引入fluent-mybatis

  • Java递归实现字符串全排列与全组合

    排列组合算法用途广泛,需要掌握,为降低门槛,本文主要关注算法的逻辑和简易性,未重视算法效率. 结合网络书本上的实现和自己的需求,这里列有四个目标: 1. 所有元素的全排列: ab的全排列是ab, ba(顺序相关); 2. 所有元素的全组合: ab的全组合是a, b, ab(顺序无关); 3. 求n个元素中选取m个元素的组合方式有哪些: abc中选2个元素的组合是ab, ac, bc; 4. 求n个元素中选取m个元素的排列方式有哪些: abc中选2个元素的排列是ab, ba, ac, ca, bc

  • Java IO流 File类的常用API实例

    •File类 1.只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问. package cn.test; import java.io.File; import java.io.IOException; public class Demo16 { public static void main(String[] args) { File file = new File("F:\\javaio"); //文件(目录)是否存在 if(!file.exists()) { /

  • 如何利用Java递归解决“九连环”公式

    在之前有写到过一点点有关递归的东西点击打开链接,然后想到小时候自己玩的一个玩具--九连环.小时候自己曾经一边玩一边用笔记下来解开这个东西的公式,那是十几年前的事情了.前两天突然想起来,九连环的基本操作就是一个递归,一个感觉起来非常标准的递归过程. 九连环的玩法规则用一句话来概括就是:如果你想要卸掉某一环或者装上某一环,只需要保留这一环前面一环,再之前所有的环都卸掉.(例如你想要卸掉或者装上第9环,那么保留第8环,第8环之前的所有的环都卸掉)其中第一环可以直接卸掉.(其实第一第二这两环可以一起装上

  • java递归法求字符串逆序

    本文实例讲述了java递归法求字符串逆序的方法.分享给大家供大家参考.具体实现方法如下: public static String reverseString(String x) { if(x==null || x.length()<2) return x; return reverseString(x.substring(1,x.length()))+ x.charAt(0); } 希望本文所述对大家的java程序设计有所帮助.

  • Java递归读取文件例子_动力节点Java学院整理

    Java递归列出目录下全部文件 /** * 列出指定目录的全部内容 * */ import java.io.*; class Recursion{ public static void main(String[] args) { String fileName="D:"+File.separator; File f=new File(fileName); printFile(f); } public static void printFile(File f){ if(f!=null){

  • Oracle实现动态SQL的拼装要领

    虽说Oracle的动态SQL语句使用起来确实很方便,但是其拼装过程却太麻烦.尤其在拼装语句中涉及到date类型字段时,拼装时要加to_char先转换成字符,到了sql中又要使用to_date转成date类型和原字段再比较. 例如有这样一个SQL语句: select '========= and (t.created>=to_date('''||to_char(sysdate,'yyyy-mm-dd')||''',''yyyy-mm-dd'') AND t.created< to_date(''

  • JS下高效拼装字符串的几种方法比较与测试代码

    在使用Ajax提交信息时,我可能常常需要拼装一些比较大的字符串通过XmlHttp来完成POST提交.尽管提交这样大的信息的做法看起来并不优雅,但有时我们可能不得不面对这样的需求.那么JavaScript中对字符串的累加速度如何呢?我们先来做下面的这个实验.累加一个长度为30000的字符串. 测试代码1 - 耗时: 14.325秒 复制代码 代码如下: var str = ""; for (var i = 0; i < 50000; i++) { str += "xxxx

  • Java递归遍历树形结构

    废话不多说了,直接给大家贴代码,具体代码如下所示: //菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { JSONArray childMenu = new JSONArray(); for (Object object : menuList) { JSONObject jsonMenu = JSONObject.fromObject(object); int menuId = jsonMenu.ge

随机推荐