# 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