Отправка запроса GraphQl в java

Я новичок в GraphQL. Я знаю, что это очень простой вопрос. Но попытался потратить много времени, и я не смог этого сделать.

Мое требование заключается в том, что мне нужно отправить запрос GraphQL, используя методы api graphql-java из класса java.

Вот запрос:

{
  contentItem(itemId: 74152479) {
    slug
    updatedAt
    contributors {
      id
      isFreeForm
      name
    }
  }
}

Ответ 1

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

Я тоже новичок в GraphQL (java), вместо того чтобы поделиться с вами прямым ответом, я намеревался показать вам, как я разрешаю аналогичную проблему.

graphql-java действительно отлично справился со своими тестовыми примерами. Вы можете обратиться сюда: https://github.com/andimarek/graphql-java/tree/master/src/test/groovy/graphql, чтобы получить некоторые идеи о том, как создавать и запрашивать схему GraphQL.

Аргументы

Я нашел такой же случай, как и ваш: https://github.com/andimarek/graphql-java/blob/master/src/test/groovy/graphql/StarWarsSchema.java#L131

newFieldDefinition()
    .name("human")
    .type(humanType)
    .argument(newArgument()
        .name("id")
        .description("id of the human")
        .type(new GraphQLNonNull(GraphQLString))
        .build())
    .dataFetcher(StarWarsData.getHumanDataFetcher())
    .build())

В этом случае определяется только один аргумент, который является id. new GraphQLNonNull(GraphQLString) сообщает, что это обязательный строковый аргумент.

Поля

Для полей он определяется в humanType, вы можете обратиться к https://github.com/andimarek/graphql-java/blob/master/src/test/groovy/graphql/StarWarsSchema.java#L51. Вложенные поля - это еще один тип с некоторыми полями, например .type(nestedHumanType)

Сбор данных

В конце концов, вы можете обработать аргумент id и вернуть некоторые данные. Вы можете обратиться к приведенному здесь примеру: https://github.com/andimarek/graphql-java/blob/master/src/test/groovy/graphql/StarWarsData.groovy#L84

Чтобы мой код выглядел более чистым, обычно я создам отдельный класс для DataFetcher, например:

public class HumanDataFetcher implements DataFetcher {
    @Override
    public Object get(DataFetchingEnvironment environment) {
        String id = (String)environment.get("id");
        // Your code here
    }
}

Надеюсь, что это поможет.

Ответ 2

Вы можете использовать

environment.getFieldDefinition().getName().equals(expected_query_name)

Это даст имя запроса, и вы сможете различать запросы