Sitemap

Why REST Is Not Enough: A Deep Dive into GraphQL

3 min readFeb 17, 2025

--

Press enter or click to view image in full size

For years, REST (Representational State Transfer) has been the go-to architecture for designing APIs. While RESTful APIs are powerful, they come with certain limitations – over-fetching data, under-fetching data, and complex endpoint management, to name a few.

Enter GraphQL – a flexible query language that solves many of REST’s pain points by allowing clients to request exactly what they need. But is GraphQL always the better choice? Let’s explore why REST is not enough and how GraphQL addresses modern API challenges.

The Limitations of REST

While REST APIs are widely used, they come with a few challenges:

1. Over-fetching and Under-fetching of Data

In REST, the API response structure is fixed. This means:

Over-fetching: The client gets more data than it needs.

Under-fetching: The client doesn’t get enough data, requiring multiple API calls.

Example: REST Over-fetching Issue

Imagine an endpoint that fetches user details:

GET /users/123

Response:

{
"id": 123,
"name": "John Doe",
"email": "john@example.com",
"address": {
"city": "New York",
"zip": "10001"
},
"orders": [
{ "id": 1, "amount": 100 },
{ "id": 2, "amount": 250 }
]
}

Here, the address and orders fields are unnecessary, but they are still returned.

Example: Under-fetching in REST

If the app also needs order details, it must make another request:

GET /users/123/orders

This means multiple API calls, which can slow down performance.

GraphQL Solution: Clients can request only the fields they need, reducing unnecessary data transfer.

query {
user(id: 123) {
name
email
}
}

Response:

{
"user": {
"name": "John Doe",
"email": "john@example.com"
}
}

2. Too Many Endpoints to Manage

REST APIs require multiple endpoints for different data needs. For example:

/users/{id} → Fetch user details

/users/{id}/orders → Fetch user orders

/users/{id}/address → Fetch user address

With GraphQL, one endpoint (/graphql) handles all queries, simplifying API management.

3. Backend-Controlled Responses

REST APIs return fixed responses, meaning developers need to modify backend code whenever clients need new fields.

With GraphQL, the client defines the response structure, reducing backend changes.

4. Poor Performance in Nested Data Fetching

Fetching nested resources in REST often requires multiple requests.

Example: Fetching a User’s Orders in REST

1. Get user details:

GET /users/123

2. Get the user’s orders:

GET /users/123/orders

3. Get product details for each order:

GET /orders/1/products

This waterfall request pattern increases latency.

GraphQL Solution: Nested Queries

GraphQL allows fetching all related data in a single request:

query {
user(id: 123) {
name
orders {
id
amount
products {
name
price
}
}
}
}

Response:

{
"user": {
"name": "John Doe",
"orders": [
{
"id": 1,
"amount": 100,
"products": [
{ "name": "Laptop", "price": 1200 }
]
}
]
}
}

Why GraphQL is a Better Alternative

✅ 1. Fetch Exactly What You Need

GraphQL eliminates over-fetching and under-fetching by allowing clients to request only the necessary fields.

✅ 2. Single Endpoint

Instead of multiple REST endpoints, GraphQL uses a single /graphql endpoint for all queries and mutations.

✅ 3. Strongly Typed Schema

GraphQL enforces a strict schema, improving API documentation and validation.

✅ 4. Better Performance for Nested Data

GraphQL allows fetching related data in a single query, reducing network requests.

Conclusion

While REST APIs have served us well, they struggle with modern application requirements like efficient data fetching, reducing endpoints, and flexible queries. GraphQL solves these issues by allowing clients to fetch exactly what they need, use a single endpoint, and handle nested queries efficiently.

However, REST still has its place – especially for simple APIs with predictable responses. The choice between GraphQL and REST depends on your project’s needs.

So, is GraphQL the future? Maybe. But one thing is certain: REST alone is no longer enough for modern applications.

--

--

Aashish Kumar
Aashish Kumar

Written by Aashish Kumar

Hi, I’m Aashish Kumar, a passionate software engineer from India 🇮🇳, specialize in Python | Django | AI | LLM | Full Stack Development.