# DynaGraphQL **Repository Path**: hellowllh/dyna-graph-ql ## Basic Information - **Project Name**: DynaGraphQL - **Description**: 动态的GraphQL,实现。语法是json的语言,非标准GraphQL语法。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-16 - **Last Updated**: 2025-06-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # [背景](https://www.cnblogs.com/wlh1995/p/14446699.html) 遇到了[GraphQL的应用场景](https://cloud.tencent.com/developer/article/1477870)。 - 聚合数据,减少网络的请求次数. - 可以转化,返回的格式。 - 方便开发,便于维护. # 对比 ## GraphQL/Falcor - 优点: 算是鼻祖吧。 - 缺点: > 他们都是静态类型的,这会给后端增加学习成本。 > 这也是一些公司推不下去的原因。 > 不是json格式的,服气呀。 ## APIJson 动态的实现。 - 优点: 动态的类型 - 缺点: > 只支持关系型数据库,不是规范级别的。 > 看过里面的代码,耦合性太高了,不适合集成现在的框架。 > json -> sql 还得自己重写他的方法。 ## 最终决定 参考GraphQL的语法,实现json的GraphQL。自己写递归解析,把扩展的处理接口抛出来。 # 接入第三方: demo使用 @see com.gitee.sxran.dynagraphql.demo.DynGraphqlResolverSyncDemo#main ```java public class DynGraphqlResolverSyncDemo extends DynGraphqlResolverSync { /** * @param json 数组 */ public DynGraphqlResolverSyncDemo(JSONArray json) { super(json); } public Object execPath(String path , JSONObject argJson, JSONObject alisJson, JSONObject subJson){ return argJson.getStr("name","lisi"); } public static void main(String[] args) throws Exception { String pathTem = SystemUtil.getUserInfo().getCurrentDir() + "/service/%s.json"; String body = FileUtil.readUtf8String(String.format(pathTem, "hello")); DynGraphqlResolverSyncDemo dynGraphqlResolver = new DynGraphqlResolverSyncDemo(JSONUtil.parseArray(body)); JSONObject resultJson = dynGraphqlResolver.run(); log.debug(""+resultJson); } } ``` @see com.gitee.sxran.dynagraphql.demo.DynGraphqlResolverASyncDemo#main ```java package com.gitee.sxran.dynagraphql.demo; import cn.hutool.core.io.FileUtil; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import cn.hutool.system.SystemUtil; import com.gitee.sxran.dynagraphql.DynGraphqlResolver; import com.gitee.sxran.dynagraphql.DynGraphqlResolverAsync; import com.gitee.sxran.dynagraphql.DynGraphqlResolverSync; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; /** * 动态graphQHL的实现。 * 其他的可以实现execPath */ public class DynGraphqlResolverASyncDemo extends DynGraphqlResolverAsync { /** * @param json 数组 */ public DynGraphqlResolverASyncDemo(JSONArray json) { super(json); } public Object execPath(String path , JSONObject argJson, JSONObject alisJson, JSONObject subJson){ // 模拟交易执行时间。 Integer sleep = argJson.getInt("sleep",1000); System.out.println( path + "=" + System.currentTimeMillis()+"=sleep="+sleep); ThreadUtil.sleep(sleep); return argJson.getStr("name","lisi"); } public static void main(String[] args) throws Exception { String pathTem = SystemUtil.getUserInfo().getCurrentDir() + "/service/%s.json"; String body = FileUtil.readUtf8String(String.format(pathTem, "hello")); DynGraphqlResolverASyncDemo dynGraphqlResolver = new DynGraphqlResolverASyncDemo(JSONUtil.parseArray(body)); JSONObject resultJson = dynGraphqlResolver.run(); log.debug(""+resultJson); } } ``` # json-array参数 ## 说明 - ~开头 : 系统要求的 - ~name : // 返回节点名称 - ~path : // 对应url的path - !开头 : 固定参数不转换 - @开头 : 从jsonArray中el表达式中获得 - #开头 : 子集,嵌套调用。 - $开头 : 从结果集中el表达式中获得(如果是同步处理的话,注意数组顺序。异步不需要) - 没有特殊字符开头的 : 别名用于转化结果集。 ## json-array ```json [{ "!name" : "zhangsan", "!sleep" : "2000", "~name" : "hello1", "~path" : "hello" },{ "!sleep" : "1000", "$name" : "hello1", "~name" : "hello0", "~path" : "hello" },{ "!sleep" : "300", "!name" : "zhangsan2", "~name" : "hello2", "~path" : "hello" }] ``` ## 结果集: ```json {"hello0":"zhangsan","hello1":"zhangsan","hello2":"zhangsan2"} ``` # 扩展 ```java /** * 从execAction中整理的内容,下放到子类具体实现。 * @param path 路径. * @param argJson 参数. * @param alisJson 别名. * @param subJson 子集嵌套. * @return */ public abstract Object execPath(String path , JSONObject argJson, JSONObject alisJson, JSONObject subJson){ // 1.通过path找到对应的method. // 2. 把argJson、subJson转化成对应方法的入参. // 3. 执行方法 // 4. 可选择性通过alisJson完成别名的转化。 // 5. 返回结果值. return ""; } ``` # 导入jar ## 地址 https://jitpack.io/#com.gitee.sxran/dyna-graph-ql/1.0.0 ## pom.xml 依赖 To get a Git project into your build: Step 1. Add the JitPack repository to your build file ```xml jitpack.io https://jitpack.io ``` Step 2. Add the dependency ```xml com.gitee.sxran dyna-graph-ql 1.0.0 ``` # 已接入项目: - https://gitee.com/sxran/Great