[JAVA] Mutation avec GraphQL

Dans cet article, l'exemple d'application utilisé dans «Implémenter GraphQL avec Spring Boot» est décrit à titre d'exemple.

Définition du schéma de mutation

Tout d'abord, il est souhaitable de nommer Mutation avec un verbe associé à l'application. Cette fois, je prendrai trois arguments, id, name et pageCount, et définirai un schéma de type Book pour la valeur de retour.

schema.graphqls


type Mutation {
	registerBook (
    	id: ID
	    name: String!
	    pageCount: Int
	): Book
}

Du côté serveur

L'implémentation côté serveur est la suivante. Je dois implémenter GraphQLMutationResolver (je le fais parce que je l'implémente en Java, je pense que cela sera différent dans d'autres langues). De plus, comme décrit dans la définition du schéma, la valeur de retour est un résolveur de type Book, registerBook, avec id, name et pageCount comme arguments (le contenu est une implémentation factice comme décrit dans le commentaire).

BookResolver.java


@Component
public class BookResolver implements GraphQLQueryResolver, GraphQLMutationResolver {
	
	public Book bookById(String bookId) {
		//Dans la plupart des cas, les données sont en fait lues et renvoyées à partir d'un magasin de données, mais ici une valeur fictive est renvoyée.
		Book book = new Book();
		book.setId(bookId);
		book.setName("bookName");
		book.setPageCount(900);
		Author author = new Author();
		author.setId("0001");
		author.setFirstName("fName");
		author.setLastName("lName");
		book.setAuthor(author);
		return book;
	}
	
	public Book registerBook(String id, String name, int pageCount) {
		//En fait, le processus d'enregistrement des données est effectué ici
		
		//Renvoyer le livre selon la définition du schéma GraphQL. Généralement, les données enregistrées sont renvoyées.
		Book book = new Book();
		book.setId(id);
		book.setName(name);
		book.setPageCount(pageCount);
		
		return book;
	}
}

Exécuter la mutation

Je vais en fait lancer Mutation. Vous pouvez définir tous les arguments et lancer comme suit. Étant donné que le type de livre est renvoyé en raison de la définition du schéma, la requête ici consiste à obtenir l'id et le nom dans le type de livre en tant que réponse.

mutation {
  registerBook(id: "1", name:"bookName", pageCount:100) {
    id
    name
  }
}

La réponse ressemble à ceci:

{
  "data": {
    "registerBook": {
      "id": "1",
      "name": "bookName"
    }
  }
}

Étant donné que l'argument de nom de registerBook est requis, la requête suivante entraînera une erreur de syntaxe.

mutation {
  registerBook(id:"1", pageCount:100) {
    id
    name
  }
}

Au contraire, comme les arguments autres que nom ne sont pas essentiels, la requête suivante peut être exécutée (ne spécifiez que les arguments requis).

mutation {
  registerBook(name:"bookName") {
    id
    name
  }
}

Enregistrement de données multiples avec une mutation

Ajoutez un autre champ à la mutation pour enregistrer plusieurs données. Ici, ajoutez registerAuthor.

schema.graphqls


type Mutation {
	registerBook (
    	id: ID
	    name: String!
	    pageCount: Int
	): Book
	
	registerAuthor (
		id: ID
		firstName: String
		lastName: String
	): Author
}

Du côté du serveur, ajoutez registerAuthor comme indiqué ci-dessous.

BookResolver.java


@Component
public class BookResolver implements GraphQLQueryResolver, GraphQLMutationResolver {
	
	public Book bookById(String bookId) {
		//Dans la plupart des cas, les données sont en fait lues et renvoyées à partir d'un magasin de données, mais ici une valeur fictive est renvoyée.
		Book book = new Book();
		book.setId(bookId);
		book.setName("bookName");
		book.setPageCount(900);
		Author author = new Author();
		author.setId("0001");
		author.setFirstName("fName");
		author.setLastName("lName");
		book.setAuthor(author);
		return book;
	}
	
	public Book registerBook(String id, String name, int pageCount) {
		//En fait, le processus d'enregistrement des données est effectué ici
		
		//Renvoyer le livre selon la définition du schéma GraphQL. Généralement, les données enregistrées sont renvoyées.
		Book book = new Book();
		book.setId(id);
		book.setName(name);
		book.setPageCount(pageCount);
		
		return book;
	}
	
	public Author registerAuthor(String id, String firstName, String lastName) {
		//En fait, le processus d'enregistrement des données est effectué ici
		
		//Renvoie Author selon la définition du schéma GraphQL. Généralement, les données enregistrées sont renvoyées.
		Author author = new Author();
		author.setId(id);
		author.setFirstName(firstName);
		author.setLastName(lastName);
		
		return author;
	}
}

La requête est la suivante.

mutation {
  registerBook(id:"1", name:"bookName", pageCount:100) {
    id
    name
    pageCount
  }
  registerAuthor(id:"1", firstName:"fName", lastName: "lName") {
    id
    firstName
    lastName
  }
}

Exécuter la mutation à l'aide de variables de requête

Il est également possible de modifier dynamiquement la valeur enregistrée dans Mutation à l'aide d'une "variable de requête". La requête ressemble à ceci:

mutation createBook($id:ID $name:String! $pageCount:Int) {
  registerBook(id:$id, name:$name, pageCount: $pageCount) {
    id
    name
    pageCount
  }
  registerAuthor(id:$id, firstName:"fName", lastName: "lName") {
    id
    firstName
    lastName
  }
}

Un nom de mutation arbitraire est requis après la mutation syntaxiquement pour recevoir les variables de requête (createBook ci-dessus). La variable de requête peut être n'importe quel nom de variable avec "$" au début.

Puisque GraphiQL et GraphQL Playground ont une fenêtre de variable de requête, définissez la valeur à définir dans la variable de cette fenêtre au format JSON et exécutez-la. Le nom de la clé JSON sera le nom de la variable de requête. キャプチャ.PNG

c'est tout.

Recommended Posts

Mutation avec GraphQL
Implémenter GraphQL avec Spring Boot
Tester le résolveur GraphQL avec rspec
J'ai essayé GraphQL avec Spring Boot
Comment créer une API avec GraphQL et Rails