Как составлять запросы на связь между Java-сервером и сторонним API-интерфейсом GraphQL? - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь интегрировать (создать безупречную передачу данных) мой бэкэнд на основе Java и сторонний API GraphQL.

Я нашел похожий вопрос, который частично отвечает на мой. Как получить доступ к GitHub GraphQL API?

Все запросы, которые я искал в поисковой системе или фрагменты, найденные на Github, связаны с тем, как создавать GraphQL API на стороне сервера, поэтому мой Back-end будет иметь обертку / конечную точку GraphQL.Это не так для меня.

Вопрос заключается в следующем, если есть какие-либо обертки, аннотации, которые я могу использовать, которые упрощают создание query s и mutation s из POJO.Причина, по которой я хочу этого, вместо создания жестко запрограммированных строк, мои объекты могут быть динамическими и включать, исключать поля.Мне нужны примеры как для мутаций, так и для запросов.Естественно, я не хочу создавать много пользовательских распознавателей.

1 Ответ

0 голосов
/ 19 декабря 2018

Так как я не нашел ни одного ответа или библиотеки с достаточно значительной документацией во время написания кода.Я создал свою собственную оболочку для упаковки POJO в mutation и query.

. Эта реализация может работать не для всех API GraphQL.Поэтому важно отметить, что эта реализация была создана специально для интеграции 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 для requestParams

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 объектов значением по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...