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
}
}
}
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.
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.
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)
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.
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 } } }" }
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:
Votre requête peut donc ressembler à:
query contentItem($itemId: Int){
contentItem(itemId: $itemId) {
slug
updatedAt
contributors {
id
isFreeForm
name
}
}
}
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
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
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