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

У меня есть вопрос относительно структуры запроса, который сейчас представлен в виде строки. Я использую синтаксис ${value} для подстановки значений, например, чтобы изменить параметр take с 20 на 50. Однако, если мне нужно заменить take на условия startDate и endDate для выбора данных в заданном интервале, я не понимаю, как это реализовать более аккуратно.

Я представляю, что запрос должен иметь структуру класса-строителя, где будет основа запроса с заранее определенными полями, а конфигурируемая часть сможет настраиваться с помощью методов, таких как builder.startDate(sd).endDate(ed).build(). Но меня беспокоит, как правильно организовать каркас запроса, поскольку использование строк для этого может быть неудобным. Если мы будем добавлять разные части к запросу, то может возникнуть путаница с тем, где именно должно происходить добавление параметров.

Подскажите, как лучше всего реализовать такую структуру запроса в соответствии с best-practice?
  • 23 января 2025 г. 9:34
Ответы на вопрос 1
Создание графов запросов GraphQL в программном коде может быть упрощено с помощью построителей или классов, которые формируют структуру вашего запроса программно. Это избавляет от проблем с форматированием строк и позволяет легко добавлять и изменять параметры запроса. Вот пример, как можно организовать такой подход на языке Java, но концепция будет понятна и на других языках.

### 1. Создание класса-строителя

Вы можете создать `QueryBuilder`, который будет собирать ваш запрос. В этом классе вы можете определить методы для добавления параметров в запрос.

```java
public class QueryBuilder {
    private StringBuilder query;
    private List<String> parameters;

    public QueryBuilder() {
        query = new StringBuilder("{ data ");
        parameters = new ArrayList<>();
    }

    public QueryBuilder take(int value) {
        parameters.add("take: " + value);
        return this;
    }

    public QueryBuilder startDate(String startDate) {
        parameters.add("startDate: \"" + startDate + "\"");
        return this;
    }

    public QueryBuilder endDate(String endDate) {
        parameters.add("endDate: \"" + endDate + "\"");
        return this;
    }

    public String build() {
        if (!parameters.isEmpty()) {
            query.append("(").append(String.join(", ", parameters)).append(")");
        }
        query.append(" }");
        return query.toString();
    }
}
```

### 2. Использование класса-строителя

Теперь, чтобы создать ваш запрос, вы можете использовать следующий код:

```java
public class Main {
    public static void main(String[] args) {
        String query = new QueryBuilder()
            .take(50)
            .startDate("2023-01-01")
            .endDate("2023-12-31")
            .build();
        
        System.out.println(query);
        // Вывод: { data (take: 50, startDate: "2023-01-01", endDate: "2023-12-31") }
    }
}
```

### 3. Преимущества данного подхода

- **Читаемость**: Код более понятен, чем длинные строки с шаблонами.
- **Поддержка**: Легко добавлять или изменять параметры запроса без необходимости отслеживания синтаксиса строк.
- **Предотвращение ошибок**: Исключает возможность синтаксических ошибок, связанных с неправильной вставкой значений в строку.

### 4. Расширение функционала

Вы можете легко расширить класс, добавляя новые методы для других параметров или опций, таких как фильтрация, сортировка и т.д., передавая их в ваш запрос аналогичным образом.

Этот подход позволяет поддерживать чистоту и организованность кода, в то же время предоставляя нужную гибкость для построения различных запросов в зависимости от требований вашего приложения.
Похожие вопросы