What is GraphQL APIs?
GraphQL is an open-source query language for APIs and a server-side runtime for executing those queries. It's essentially a protocol that dictates how a client (like a mobile app or website) can request data from a server, providing a more efficient and flexible alternative to traditional API designs like REST.
Core Theory and Concepts
GraphQL is built around a few key theoretical concepts:
1. Schema and Type System
A GraphQL Schema is the central component and acts as a contract between the client and the server. It uses a Strongly-Typed system to precisely define all the data that a client can request.
- Types: The schema defines the structure of data in terms of Object Types, which are named collections of fields. For example, a User type might have name, email, and posts fields.
- Fields: These are the units of data that can be requested on a type. Each field has a defined data type (like String, Int, or another custom Object Type). The presence of these types allows for validation of a query before execution and ensures predictable responses.
- Queries: These are used to fetch data. A client sends a query that mirrors the structure of the data it expects to receive. The server then returns a response that contains only the requested fields, which solves the problem of over-fetching (getting more data than you need) common in fixed-endpoint APIs.
- Mutations: These are used to modify data (create, update, or delete). Like queries, they specify the data that should be changed and the desired data to be returned after the change is complete.
- Subscriptions: These enable real-time data streams, allowing a client to subscribe to a specific event and receive updates from the server whenever that data changes.
- A resolver is a function associated with a specific field on a type.
- When a client sends a query, the GraphQL server executes the relevant resolver functions for all the requested fields.
- Resolvers act as the bridge between the GraphQL layer and the underlying data sources (like databases, microservices, or even other REST APIs). They hide the complexity of the back-end from the client, meaning the client only sees a unified "graph" of data.
- Efficiency: Clients only get the data they ask for, minimizing data transfer, which is especially beneficial for mobile applications and limited bandwidth.
- Flexibility: The client controls the data requirements, allowing for rapid front-end changes without requiring the back-end to change fixed endpoints.
- API Evolution: New fields can be added to the schema without affecting existing clients, allowing the API to evolve without needing disruptive versioning (like v1, v2).
To validate a GraphQL API using Rest Assured in Java, follow these key steps:
We'll use the public GraphQL API from https://countries.trevorblades.com/
Endpoint: https://countries.trevorblades.com/
Example Query (returns name and capital of India):
{ country(code: "IN") { name capital } }
import io.restassured.RestAssured; import io.restassured.response.Response; import org.json.JSONObject; import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.equalTo; public class GraphQLApiTest { public static void main(String[] args) { // GraphQL query as string String query = "{ country(code: \"IN\") { name capital } }"; // Prepare the JSON body JSONObject requestBody = new JSONObject(); requestBody.put("query", query); // Set base URI RestAssured.baseURI = "https://countries.trevorblades.com/"; // Send POST request and validate response given() .header("Content-Type", "application/json") .body(requestBody.toString()) .when() .post() .then() .statusCode(200) .body("data.country.name", equalTo("India")) .body("data.country.capital", equalTo("New Delhi")); } }
Validations Performed
HTTP status code =
200Country name =
"India"Capital =
"New Delhi"
<dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured</artifactId> <version>5.3.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20210307</version> </dependency>
Suggested Posts:
1. Test Basic Authentication of API in RestAssured
2. Validate Request and Response by POJO in RestAssured
3. Extract Response by JSONPath in RestAssured
4. Validate Keys in API in RestAssured
5. How to Test SOAP API in RestAssured