如何编写 Java 后端和第 3 方 GraphQL API 之间的通信请求?
How to compose requests for communication between Java back-end and 3rd party GraphQL API?
我正在尝试集成(创建完美的数据通信)我基于 Java 的后端和第 3 方 GraphQL API。
我找到了部分回答我的类似问题。
我在搜索引擎上搜索的所有请求或我在 Github 上找到的片段都与如何在服务器端创建 GraphQL API 有关,所以我的后端将有 GraphQL wrapper/endpoint。对我来说不是这样。
问题如下,如果有任何包装器、我可以使用的注释来简化来自 POJO 的 query
s 和 mutation
s 的生物。我想要它的原因是,我的对象可以是动态的,而不是创建硬编码字符串,并且包括、排除字段。我需要突变和查询的任何示例。当然,我不想创建很多自定义解析器。
因为在编写代码的过程中,我没有找到任何具有足够重要文档的答案或库。我创建了自己的包装器,用于将 POJO 包装到 mutation
和 query
.
此实现可能不适用于所有 GraphQL API。因此,需要注意的是,这个实现是专门为 Xledger
集成而创建的。
主包装器
public String simpleResolver(String operationName, String requestName, Map<String, Object> requestedParams, List<String> requestedFields, String objectNestingStructure) {
String params = nvl(requestedParams).entrySet().stream().map(p -> p.getKey() + ":" + wrapWithQuotes(p.getValue())).collect(joining(","));
String[] obejctNesting = nvl(objectNestingStructure).split("\.");
String fields = nvl(requestedFields).stream().collect(joining("\n"));
return "{ \"query\":\"" + operationName + "{\n" + requestName + "(" + params + ") {\n" + buildObjectNestingStructure(obejctNesting, fields) + "}\n}\n\"," +
"\"variables\":" + null + "," +
"\"operationName\":" + null + "}";
}
嵌套类 GraphQL 结构的解析器和包装器
public String buildObjectNestingStructure(String[] objectNestingStructure, String fields) {
StringBuilder objectHead = new StringBuilder();
StringBuilder objectTail = new StringBuilder();
for (String objectNesting : objectNestingStructure) {
objectHead.append(objectNesting);
objectHead.append(" {\n");
objectTail.append("\n}");
}
objectHead.append(fields);
objectHead.append(objectTail);
return objectHead.toString();
}
请求参数的 POJO 包装器
public <T> Map<String, Object> getParams(T entity) {
Map<String, Object> params = new HashMap<String, Object>();
Class<?> cls = entity.getClass();
for (Field field : cls.getDeclaredFields()) {
try {
String fieldName = field.getName();
Object fieldValue = field.get(entity);
if (fieldValue != null) {
params.put(fieldName, fieldValue);
}
} catch(IllegalArgumentException | IllegalAccessException e) {
logger.error(e.getMessage());
}
}
return params;
}
此解决方案适用于 query
和 mutation
,因为它们都有 param
,在我的情况下,我总是至少选择 dbId
字段.
另外 nvl
是用默认值替换 null
对象的效用函数。
我正在尝试集成(创建完美的数据通信)我基于 Java 的后端和第 3 方 GraphQL API。
我找到了部分回答我的类似问题。
我在搜索引擎上搜索的所有请求或我在 Github 上找到的片段都与如何在服务器端创建 GraphQL API 有关,所以我的后端将有 GraphQL wrapper/endpoint。对我来说不是这样。
问题如下,如果有任何包装器、我可以使用的注释来简化来自 POJO 的 query
s 和 mutation
s 的生物。我想要它的原因是,我的对象可以是动态的,而不是创建硬编码字符串,并且包括、排除字段。我需要突变和查询的任何示例。当然,我不想创建很多自定义解析器。
因为在编写代码的过程中,我没有找到任何具有足够重要文档的答案或库。我创建了自己的包装器,用于将 POJO 包装到 mutation
和 query
.
此实现可能不适用于所有 GraphQL API。因此,需要注意的是,这个实现是专门为 Xledger
集成而创建的。
主包装器
public String simpleResolver(String operationName, String requestName, Map<String, Object> requestedParams, List<String> requestedFields, String objectNestingStructure) {
String params = nvl(requestedParams).entrySet().stream().map(p -> p.getKey() + ":" + wrapWithQuotes(p.getValue())).collect(joining(","));
String[] obejctNesting = nvl(objectNestingStructure).split("\.");
String fields = nvl(requestedFields).stream().collect(joining("\n"));
return "{ \"query\":\"" + operationName + "{\n" + requestName + "(" + params + ") {\n" + buildObjectNestingStructure(obejctNesting, fields) + "}\n}\n\"," +
"\"variables\":" + null + "," +
"\"operationName\":" + null + "}";
}
嵌套类 GraphQL 结构的解析器和包装器
public String buildObjectNestingStructure(String[] objectNestingStructure, String fields) {
StringBuilder objectHead = new StringBuilder();
StringBuilder objectTail = new StringBuilder();
for (String objectNesting : objectNestingStructure) {
objectHead.append(objectNesting);
objectHead.append(" {\n");
objectTail.append("\n}");
}
objectHead.append(fields);
objectHead.append(objectTail);
return objectHead.toString();
}
请求参数的 POJO 包装器
public <T> Map<String, Object> getParams(T entity) {
Map<String, Object> params = new HashMap<String, Object>();
Class<?> cls = entity.getClass();
for (Field field : cls.getDeclaredFields()) {
try {
String fieldName = field.getName();
Object fieldValue = field.get(entity);
if (fieldValue != null) {
params.put(fieldName, fieldValue);
}
} catch(IllegalArgumentException | IllegalAccessException e) {
logger.error(e.getMessage());
}
}
return params;
}
此解决方案适用于 query
和 mutation
,因为它们都有 param
,在我的情况下,我总是至少选择 dbId
字段.
另外 nvl
是用默认值替换 null
对象的效用函数。