APIs power every modern application — mobile apps, microservices, dashboards, IoT devices, and more. And today, developers have three major API technologies to choose from:
- REST (HTTP/JSON)
- gRPC (HTTP/2 + Protocol Buffers)
- GraphQL (single endpoint + flexible queries)
Each has its strengths, weaknesses, and ideal use cases.
🌐 1. REST — The Traditional Standard
REST is the most widely used API style, built around:
- Resources (
/users,/orders) - HTTP verbs (
GET,POST,PUT,DELETE) - JSON as the default format
✔ Strengths
- Easy to understand
- Browser-friendly
- Great tooling
- Good for public APIs
❌ Weaknesses
- Over-fetching
- Under-fetching
- JSON overhead
- HTTP/1.1 latency
Java Example
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable int id) {
return new User(id, "John Doe");
}
}
⚡ 2. gRPC — High-Performance, Low-Latency APIs
gRPC uses:
- HTTP/2
- Protocol Buffers
- Generated client/server code
- Streaming
✔ Strengths
- Extremely fast
- Small binary payloads
- Streaming support
- Strong typing
❌ Weaknesses
- Not browser-native
- Harder to debug binary payloads
gRPC Java Example
user.proto:
syntax = "proto3";
service UserService {
rpc GetUser(GetUserRequest) returns (GetUserResponse);
}
message GetUserRequest {
int32 id = 1;
}
message GetUserResponse {
int32 id = 1;
string name = 2;
}
Server:
public class UserServiceImpl extends UserServiceGrpc.UserServiceImplBase {
@Override
public void getUser(GetUserRequest request, StreamObserver<GetUserResponse> responseObserver) {
GetUserResponse response = GetUserResponse.newBuilder()
.setId(request.getId())
.setName("John Doe")
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
🔍 3. GraphQL — Flexible Queries for Frontend Apps
GraphQL allows clients to request exactly the data they need.
✔ Strengths
- Avoids over-fetching
- Strong schema
- Great for mobile & dashboards
❌ Weaknesses
- Harder caching
- Over-fetching risks in resolvers
- Performance overhead in large graphs
Java Example (Spring GraphQL)
Schema:
type User {
id: Int
name: String
}
type Query {
user(id: Int!): User
}
Resolver:
@Component
public class UserQueryResolver implements GraphQLQueryResolver {
public User user(int id) {
return new User(id, "John Doe");
}
}
🏎 Performance Comparison
| Feature | REST | gRPC | GraphQL |
|---|---|---|---|
| Transport | HTTP/1.1 | HTTP/2 | HTTP/1.1 |
| Format | JSON | ProtoBuf (binary) | JSON |
| Speed | Medium | Fastest | Medium |
| Streaming | ❌ No | ✔ Yes | ⚠ Partial |
| Browser support | ✔ Excellent | ⚠ Needs gRPC-Web | ✔ Excellent |
| Typing | Weak | Strong | Strong |
| Ideal for | Public APIs | Microservices | Frontend apps |
🎯 When to Choose What?
✔ Use REST when:
- Building public APIs
- Browser-based clients
- Simplicity matters
✔ Use gRPC when:
- You need performance
- Microservices communicate internally
- You need streaming
✔ Use GraphQL when:
- Frontend needs flexible queries
- You want to avoid over-fetching
- Mobile apps require optimized data loads
🧠 Final Summary
- REST → Simple, universal
- gRPC → Fast, efficient, best for microservices
- GraphQL → Flexible, client-driven
Each excels in different scenarios.