[JAVA] Mutation mit GraphQL

In diesem Artikel wird die in "GraphQL mit Spring Boot implementieren" verwendete Beispielanwendung als Beispiel beschrieben.

Definition des Mutationsschemas

Zunächst ist es wünschenswert, Mutation mit einem der Anwendung zugeordneten Verb zu benennen. Dieses Mal nehme ich drei Argumente, id, name und pageCount, und definiere ein Buchtypschema für den Rückgabewert.

schema.graphqls


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

Serverseite

Die serverseitige Implementierung ist wie folgt. Ich muss GraphQLMutationResolver implementieren (ich mache das, weil ich es in Java implementiere, ich denke, es wird in anderen Sprachen anders aussehen). Wie in der Schemadefinition beschrieben, definiert der Rückgabewert auch registerBook, einen Book-Typ-Resolver, mit id, name und pageCount als Argumenten (der Inhalt ist eine Dummy-Implementierung, wie im Kommentar beschrieben).

BookResolver.java


@Component
public class BookResolver implements GraphQLQueryResolver, GraphQLMutationResolver {
	
	public Book bookById(String bookId) {
		//In den meisten Fällen werden Daten tatsächlich gelesen und aus einem Datenspeicher zurückgegeben, aber hier wird ein Dummy-Wert zurückgegeben.
		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) {
		//Tatsächlich wird hier der Datenregistrierungsprozess durchgeführt
		
		//Rückgabebuch gemäß GraphQL-Schemadefinition. Im Allgemeinen werden die registrierten Daten zurückgegeben.
		Book book = new Book();
		book.setId(id);
		book.setName(name);
		book.setPageCount(pageCount);
		
		return book;
	}
}

Führen Sie Mutation aus

Ich werde tatsächlich Mutation werfen. Sie können alle Argumente festlegen und wie folgt werfen. Da der Buchtyp aufgrund der Schemadefinition zurückgegeben wird, besteht die Abfrage hier darin, die ID und den Namen im Buchtyp als Antwort abzurufen.

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

Die Antwort sieht folgendermaßen aus:

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

Da das Argument name von registerBook erforderlich ist, führt die folgende Abfrage zu einem Syntaxfehler.

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

Im Gegenteil, da die anderen Argumente als name nicht wesentlich sind, kann die folgende Abfrage ausgeführt werden (geben Sie nur die erforderlichen Argumente an).

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

Mehrfache Datenregistrierung mit einer Mutation

Fügen Sie der Mutation ein weiteres Feld hinzu, um mehrere Daten zu registrieren. Fügen Sie hier registerAuthor hinzu.

schema.graphqls


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

Fügen Sie auf der Serverseite registerAuthor wie unten gezeigt hinzu.

BookResolver.java


@Component
public class BookResolver implements GraphQLQueryResolver, GraphQLMutationResolver {
	
	public Book bookById(String bookId) {
		//In den meisten Fällen werden Daten tatsächlich gelesen und aus einem Datenspeicher zurückgegeben, aber hier wird ein Dummy-Wert zurückgegeben.
		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) {
		//Tatsächlich wird hier der Datenregistrierungsprozess durchgeführt
		
		//Rückgabebuch gemäß GraphQL-Schemadefinition. Im Allgemeinen werden die registrierten Daten zurückgegeben.
		Book book = new Book();
		book.setId(id);
		book.setName(name);
		book.setPageCount(pageCount);
		
		return book;
	}
	
	public Author registerAuthor(String id, String firstName, String lastName) {
		//Tatsächlich wird hier der Datenregistrierungsprozess durchgeführt
		
		//Autor gemäß GraphQL-Schemadefinition zurückgeben. Im Allgemeinen werden die registrierten Daten zurückgegeben.
		Author author = new Author();
		author.setId(id);
		author.setFirstName(firstName);
		author.setLastName(lastName);
		
		return author;
	}
}

Die Abfrage lautet wie folgt.

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

Führen Sie die Mutation mit Abfragevariablen aus

Es ist auch möglich, den in Mutation registrierten Wert mithilfe einer "Abfragevariablen" dynamisch zu ändern. Die Abfrage sieht folgendermaßen aus:

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
  }
}

Nach der syntaktischen Mutation ist ein beliebiger Mutationsname erforderlich, um Abfragevariablen zu erhalten (createBook oben). Abfragevariablen können beliebige Variablennamen mit "$" am Anfang sein.

Da GraphiQL und GraphQL Playground ein Abfragevariablenfenster haben, legen Sie den Wert, der in der Variablen in diesem Fenster festgelegt werden soll, im JSON-Format fest und führen Sie ihn aus. Der JSON-Schlüsselname ist der Name der Abfragevariablen. キャプチャ.PNG

das ist alles.

Recommended Posts

Mutation mit GraphQL
Implementieren Sie GraphQL mit Spring Boot
Testen Sie den GraphQL-Resolver mit rspec
Ich habe GraphQL mit Spring Boot ausprobiert
So erstellen Sie eine API mit GraphQL und Rails