Как составлять запросы для связи между серверной частью Java и сторонним GraphQL API?

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

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

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

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

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как создать простое погодное приложение на Python с API OpenWeatherMap
Как создать простое погодное приложение на Python с API OpenWeatherMap
Этот учебник проведет вас через процесс создания простого погодного приложения с помощью Python и OpenWeatherMap API.
Пакеты Java
Пакеты Java
Пакет java - это группа классов, интерфейсов и подпакетов схожего типа. Думайте об этом как о папке в каталоге файлов. Мы используем пакеты, чтобы...
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
0
0
173
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку за время написания кода я не нашел ни ответа, ни библиотеки с достаточно значительной документацией. Я создал свою собственную оболочку для упаковки 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 на значение по умолчанию.

Другие вопросы по теме