如何编写 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 的 querys 和 mutations 的生物。我想要它的原因是,我的对象可以是动态的,而不是创建硬编码字符串,并且包括、排除字段。我需要突变和查询的任何示例。当然,我不想创建很多自定义解析器。

因为在编写代码的过程中,我没有找到任何具有足够重要文档的答案或库。我创建了自己的包装器,用于将 POJO 包装到 mutationquery.

此实现可能不适用于所有 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;
}

此解决方案适用于 querymutation,因为它们都有 param,在我的情况下,我总是至少选择 dbId 字段.

另外 nvl 是用默认值替换 null 对象的效用函数。