web-dev-qa-db-fra.com

Envoi de la requête GraphQl dans java

Je suis nouveau sur GraphQL. Je sais que c'est une question très fondamentale. Mais j'ai essayé de passer beaucoup de temps et je n'ai pas pu y arriver.

Mon exigence est que je dois envoyer une requête GraphQL en utilisant des méthodes API graphql-Java à partir d'une classe Java.

Voici la requête:

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

Tout d'abord, vous devez illustrer davantage votre problème, à partir de votre exemple de requête, je ne peux pas vraiment voir quelle partie vous rencontrez un problème, cela pourrait être dans l'argument , objet imbriqué , ou récupérateur de données

Je suis également nouveau sur GraphQL (Java), au lieu de partager la réponse directe avec vous, je voulais vous montrer comment résoudre le problème similaire.

graphql-Java a en fait fait un excellent travail dans leurs cas de test. Vous pouvez vous référer ici: https://github.com/andimarek/graphql-Java/tree/master/src/test/groovy/graphql pour avoir des idées sur la façon de créer et d'interroger le schéma GraphQL.

Arguments

J'ai trouvé un cas similaire comme le vôtre ici: 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())

Dans ce cas, un seul argument est défini, qui est id . new GraphQLNonNull(GraphQLString) nous dit qu'il s'agit d'un argument de chaîne obligatoire.

Des champs

Pour les champs, il définit dans humanType, vous pouvez vous référer à https://github.com/andimarek/graphql-Java/blob/master/src/test/groovy/graphql/StarWarsSchema. Java # L51 . Les champs imbriqués sont juste un autre type avec certains champs, par exemple, .type(nestedHumanType)

Récupérateur de données

Après tout, vous pourriez traiter l'argument id et renvoyer des données. Vous pouvez vous référer à l'exemple ici: https://github.com/andimarek/graphql-Java/blob/master/src/test/groovy/graphql/StarWarsData.groovy#L84

Pour rendre mon code plus propre, je vais normalement créer une classe distincte pour DataFetcher, par exemple:

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

J'espère que cela t'aides.

7
ch33hau

Tout d'abord, assurez-vous que vous pouvez obtenir un résultat en bouclant comme ça. si cela fonctionne (assurez-vous de changer le verbe en [~ # ~] obtenez [~ # ~] selon ce que le serveur de verbes attend), alors tout ce que vous doit faire est d'envoyer la partie requête dans le corps de la requête http avec le type de contenu comme application/json.

curl \
    -X POST \
    -H "Content-Type: application/json" \
    --data '{ "query": "{ contentItem(itemId: \"74152479\") { slug updatedAt    contributors { id isFreeForm name } } }" }' \
    http://www.yoursite.com/your/graphql/api

une fois que vous avez réussi, vous pouvez créer la requête et envoyer la demande en utilisant Java clients http. J'ai réussi à le faire en utilisant le client Jersey. le seul défi est de construire la requête si vous voulez avoir un générateur de requête générique. mais il existe un générateur de requêtes sur github comme celui-ci UN , et vous pouvez le modifier selon vos besoins.

Dans l'ensemble, voici ce que vous devez envoyer dans le corps http. J'ai mis le sien dans une doublure, ce qui est exactement à quoi ressemble le corps de la demande. vous devez supprimer tout format supplémentaire comme une nouvelle ligne, etc.

{ "query": "{ contentItem(itemId: \"74152479\") { slug updatedAt    contributors { id isFreeForm name } } }" }
1
yantaq

J'ai une solution qui est implémentée dans vertx-graphql-client .

Le processus pour créer universellement une requête GraphQL est le suivant:

  1. Réécrire votre requête à l'aide de variables

Votre requête peut donc ressembler à:

query contentItem($itemId: Int){
  contentItem(itemId: $itemId) {
    slug
    updatedAt
    contributors {
      id
      isFreeForm
      name
    }
  }
}
  1. Envoyez votre requête via HTTP POST requêtes avec

    • header: définir content-type à application/json

    • body: le corps est défini en sérialisant les données JSON suivantes:

{
    "query": "the-templated-query-above",
    "operationName": "contentItem",
    "variables": {
        "itemId": 74152479
    }
}

Avec curl, c'est aussi simple que:

curl \
    -X POST \
    -H "Content-Type: application/json" \
    --data '{ "query": "the-templated-query-above", "operationName": "contentItem", "variables": {  "itemId": 74152479 }}' \
    http://www.yoursite.com/your/graphql/api
1
anhldbk

Vous pouvez utiliser le

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

Cela obtiendra le nom de la requête et vous pourrez distinguer les requêtes

0
saif ali

Vous pouvez vérifier le projet graphql-maven-plugin, qui génère tout le code nécessaire pour faciliter l'exécution des requêtes GraphQL en Java.

Il est disponible sur https://github.com/graphql-Java-generator/graphql-maven-plugin-project . Son site Web est https://graphql-maven-plugin-project.graphql-Java-generator.com

Etienne

0
etienne_sf