REST (Representational State Transfer) is an architectural style for building web services that communicate over HTTP.
A Spring Boot REST API allows you to:
| Principle | Meaning |
|---|---|
| Stateless | Each request is independent |
| Client-Server | UI and backend separated |
| Uniform Interface | Standard HTTP methods |
| Resource-Based | Everything is a resource (User, Order, Product) |
| Cacheable | Responses can be cached |
| HTTP Method | Purpose | Example |
|---|---|---|
| GET | Fetch data | Get all users |
| POST | Create data | Create user |
| PUT | Update entire resource | Update user |
| PATCH | Partial update | Update email only |
| DELETE | Remove resource | Delete user |
Client (Browser / Postman)
↓
@RestController
↓
@Service
↓
@Repository (JPA)
↓
Database
Note: This HTML file preserves all headings, tables, diagrams, emojis, and formatting exactly as displayed in the screen snapshot.
In REST, stateless means:
GET /api/users/1 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Even if the same client sends another request, it must again send authentication details.
Stateful systems store client session information on the server.
Client logs in → Server creates session Server stores: SessionID = ABC123 Client sends only SessionID next time Server retrieves session data from memory
| Feature | Stateless (REST) | Stateful |
|---|---|---|
| Session Storage | No server session | Server stores session |
| Scalability | High | Limited |
| Load Balancing | Simple | Requires sticky sessions |
| Memory Usage | Low | Higher (stores sessions) |
| Best For | Microservices, APIs | Traditional web apps |
STATELESS REST Client → Request (with Token) → Server Client → Request (with Token) → Server Client → Request (with Token) → Server (No memory stored between requests) STATEFUL SYSTEM Client → Login → Server stores session Client → Request → Server checks session memory Client → Request → Server reuses stored session
REST is stateless because each request contains complete context, and the server does not rely on stored session information.
@RequestParam is used to extract query parameters from the URL in a REST API.
Example URL:
GET /api/users?id=10
The value 10 is captured using @RequestParam.
@RestController
@RequestMapping("/api")
public class UserController {
@GetMapping("/user")
public String getUser(@RequestParam int id) {
return "User ID: " + id;
}
}
Request:
GET /api/user?id=5
Response:
User ID: 5
| Attribute | Purpose |
|---|---|
| name / value | Name of query parameter |
| required | Whether parameter must be present |
| defaultValue | Default value if parameter missing |
If the parameter is not provided, Spring automatically uses the default value.
@GetMapping("/greet")
public String greetUser(@RequestParam(defaultValue = "Guest") String name) {
return "Hello " + name;
}
Requests:
GET /greet?name=John
Response:
Hello John
If parameter is missing:
GET /greet
Response:
Hello Guest
Important: When defaultValue is used, required=false automatically.
By default, parameters are required. If missing, Spring returns 400 Bad Request.
@GetMapping("/search")
public String search(@RequestParam(required = false) String keyword) {
if(keyword == null){
return "No keyword provided";
}
return "Searching for: " + keyword;
}
Request:
GET /search?keyword=laptop
Response:
Searching for: laptop
If missing:
GET /search
Response:
No keyword provided
@GetMapping("/filter")
public String filter(@RequestParam Optional<String> category) {
return category
.map(c -> "Filtering category: " + c)
.orElse("No category provided");
}
| URL | Method Parameter | Result |
|---|---|---|
| /users?id=10 | @RequestParam int id | id=10 |
| /users | required param | 400 Error |
| /users | required=false | null |
| /users | defaultValue="1" | id=1 |
@GetMapping("/products")
public String getProducts(
@RequestParam String category,
@RequestParam(defaultValue = "1") int page,
@RequestParam(required = false) String sort) {
return "Category: " + category +
", Page: " + page +
", Sort: " + sort;
}
/api/users?id=10/api/users/10defaultValue automatically makes the parameter optional