diff --git a/aws-app-sync/pom.xml b/aws-app-sync/pom.xml
new file mode 100644
index 0000000000..1f915978ab
--- /dev/null
+++ b/aws-app-sync/pom.xml
@@ -0,0 +1,56 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.6.RELEASE
+
+
+
+ com.baeldung
+ aws-app-sync
+ 0.0.1-SNAPSHOT
+ aws-app-sync
+
+ Spring Boot using AWS App Sync
+
+
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java b/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java
new file mode 100644
index 0000000000..b310e60748
--- /dev/null
+++ b/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java
@@ -0,0 +1,32 @@
+package com.baeldung.awsappsync;
+
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.web.reactive.function.BodyInserters;
+import org.springframework.web.reactive.function.client.WebClient;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+public class AppSyncClientHelper {
+
+ static String apiUrl = "https://m4i3b6icrrb7livfbypfspiifi.appsync-api.us-east-2.amazonaws.com";
+ static String apiKey = "da2-bm4rpatkkrc5jfyhvvq7itjeke";
+ static String API_KEY_HEADER = "x-api-key";
+
+ public static WebClient.ResponseSpec getResponseBodySpec(Map requestBody) {
+ return WebClient
+ .builder()
+ .baseUrl(apiUrl)
+ .defaultHeader(API_KEY_HEADER, apiKey)
+ .defaultHeader("Content-Type", "application/json")
+ .build()
+ .method(HttpMethod.POST)
+ .uri("/graphql")
+ .body(BodyInserters.fromValue(requestBody))
+ .accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
+ .acceptCharset(StandardCharsets.UTF_8)
+ .retrieve();
+ }
+
+}
diff --git a/aws-app-sync/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java b/aws-app-sync/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java
new file mode 100644
index 0000000000..19fffd2994
--- /dev/null
+++ b/aws-app-sync/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.awsappsync;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class AwsAppSyncApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(AwsAppSyncApplication.class, args);
+ }
+
+}
diff --git a/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
new file mode 100644
index 0000000000..22d99959b3
--- /dev/null
+++ b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
@@ -0,0 +1,72 @@
+package com.baeldung.awsappsync;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.web.reactive.function.client.WebClient;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+@SpringBootTest
+class AwsAppSyncApplicationTests {
+
+ @Test
+ void givenGraphQuery_whenListEvents_thenReturnAllEvents() {
+
+ Map requestBody = new HashMap<>();
+ requestBody.put("query", "query ListEvents {"
+ + " listEvents {"
+ + " items {"
+ + " id"
+ + " name"
+ + " where"
+ + " when"
+ + " description"
+ + " }"
+ + " }"
+ + "}");
+ requestBody.put("variables", "");
+ requestBody.put("operationName", "ListEvents");
+
+ String bodyString = AppSyncClientHelper.getResponseBodySpec(requestBody)
+ .bodyToMono(String.class).block();
+
+ assertNotNull(bodyString);
+ assertTrue(bodyString.contains("My First Event"));
+ assertTrue(bodyString.contains("where"));
+ assertTrue(bodyString.contains("when"));
+ }
+
+ @Test
+ void givenGraphAdd_whenMutation_thenReturnIdNameDesc() {
+
+ String queryString = "mutation add {"
+ + " createEvent("
+ + " name:\"My added GraphQL event\""
+ + " where:\"Day 2\""
+ + " when:\"Saturday night\""
+ + " description:\"Studying GraphQL\""
+ + " ){"
+ + " id"
+ + " name"
+ + " description"
+ + " }"
+ + "}";
+
+ Map requestBody = new HashMap<>();
+ requestBody.put("query", queryString);
+ requestBody.put("variables", "");
+ requestBody.put("operationName", "add");
+
+ WebClient.ResponseSpec response = AppSyncClientHelper.getResponseBodySpec(requestBody);
+
+ String bodyString = response.bodyToMono(String.class).block();
+
+ assertNotNull(bodyString);
+ assertTrue(bodyString.contains("My added GraphQL event"));
+ assertFalse(bodyString.contains("where"));
+ assertFalse(bodyString.contains("when"));
+ }
+}
diff --git a/pom.xml b/pom.xml
index c6addfa6aa..34703c6f73 100644
--- a/pom.xml
+++ b/pom.xml
@@ -896,6 +896,7 @@
atomix
aws
+ aws-app-sync
aws-lambda
aws-reactive