如何编写Java后端和第三方GraphQL API之间的通信请求?

时间:2018-12-11 12:19:18

标签: api java-8 graphql integration

我正在尝试集成(创建完美的数据通信)基于Java的后端和第三方GraphQL API。

我发现类似的问题部分回答了我的问题。 How to access the GitHub GraphQL API?

我在搜索引擎上搜索的所有请求或在Github上找到的代码段都与如何在服务器端创建GraphQL API有关,因此我的后端将具有GraphQL包装器/端点。对我来说不是这种情况。

以下是一个问题,如果有包装器,我可以使用这些注释来简化POJO中querymutation的生物。我想要它的原因,而不是创建硬编码的字符串,我的对象可以是动态的,并且包含,排除字段。对于突变和查询,我都需要任何示例。自然,我不想创建很多自定义解析器。

1 个答案:

答案 0 :(得分:0)

由于在编写代码期间,我找不到任何答案或具有足够大量文档的库。我创建了自己的包装器,用于将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字段。 / p>

nvl也是一种实用函数,用于用默认值替换null个对象。