Я хочу иметь возможность проверять, подтверждать и изменять некоторые существующие операторы graphql. Например, я генерирую следующее, используя шаблон и получаю данные из Elasticsearch
mutation {
productUpdate(
input: {
id: "gid://shopify/Product/1388950487084",
tags: ["one","two"]
}
)
{
product {
id
tags
}
userErrors {
field,
message
}
}
}
Исходя из этого, я хочу сказать, что проверьте значение id, например, получите доступ к этому значению
mutation.productUpdate.input.id
Я отправляю сообщения только третьей стороне, я не размещаю схему или что-то в этом роде.
Нужно ли мне использовать библиотеку, чтобы иметь доступ к полезной нагрузке и изменять ее? И если да, то что было бы самым легким?
Спасибо





Вы контролируете этот запрос? Обычно не рекомендуется напрямую вставлять значения в такой запрос; вместо этого вы должны использовать Переменные GraphQL, чтобы можно было передавать значения ключей отдельно от собственно запроса.
mutation ProductUpdate($id: ID!, $tags: [String!]) {
productUpdate(input: {id: $id, tags: $tags}) {
product { id tags }
userErrors { field message }
}
}
Если вы разберете спецификацию GraphQL более подробно, она состоит из нескольких основных частей: объектной модели; грамматика для разбора схем и запросов GraphQL; правила проверки для обеспечения соответствия запроса схеме; правила выполнения для фактического выполнения запроса по схеме; и транспортная часть HTTP (только в спецификации). В основном библиотеки GraphQL, которые я видел (на нескольких языках), объединяют все это в кучу, но опытные пользователи могут разбирать их по частям.
То, что вы описываете, вероятно, возможно на любом языке с достаточно зрелой библиотекой GraphQL, но у него не будет супер-удобного синтаксиса. Абстрактно вам необходимо:
Получите схему из службы (для ее получения существует стандартный запрос GraphQL, и многие библиотеки могут принимать эту форму JSON в качестве входных данных).
Разберите предложенный вами запрос, используя выбранную вами библиотеку, в абстрактное синтаксическое дерево (AST).
Найдите интересующее вас значение в структуре AST; измените его, если это то, что вы пытаетесь сделать, и это разрешено.
Проверьте запрос на соответствие AST с помощью библиотеки GraphQL.
Сериализуйте AST обратно в запрос GraphQL.
Отправьте запрос на сервер обычным способом.
Если вы не контролируете запрос, схема переменных, которую я описал изначально, может вызвать небольшие проблемы. Вы можете обнаружить (как в моем примере запроса), что значение поля является ссылкой на переменную. Вы можете переписать его, но наличие неиспользуемых переменных - ошибка валидации, так что вам может потребоваться (возможно) удалить и переменные, что может вызвать затруднения.
Хотя это не тот ответ, который я искал напрямую, подход к добавлению значений в качестве переменных решил мою проблему и теперь означает, что я делаю это более гибким способом.