DEV Community

Er. Bhupendra
Er. Bhupendra

Posted on

PART 2 :CONTROLLER ALL CONCEPT IN SPRINGBOOT PROJECT

Haan Bilkul Sahi! Controller Mein Sirf 4 Tarah Ka Data Aata Hai 🎯


4 Input Sources - Yaad Rakho Bas Ye:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Controller Mein Data Kahan Se Aata Hai?     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                β”‚
β”‚  1️⃣  URL PATH       β†’ @PathVariable           β”‚
β”‚  2️⃣  QUERY STRING   β†’ @RequestParam           β”‚
β”‚  3️⃣  REQUEST BODY   β†’ @RequestBody            β”‚
β”‚  4️⃣  HEADERS        β†’ @RequestHeader          β”‚
β”‚                                                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Enter fullscreen mode Exit fullscreen mode

1️⃣ @PathVariable - URL Path Mein Data

Kab Use Kare:

  • Resource identify karna ho (ID, username, slug)
  • URL ka part ho data

Examples:

// Example 1: Single path variable
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
    // URL: /users/123
    // id = 123
    return userService.findById(id);
}

// Example 2: Multiple path variables
@GetMapping("/users/{userId}/orders/{orderId}")
public Order getUserOrder(
    @PathVariable Long userId,
    @PathVariable Long orderId
) {
    // URL: /users/5/orders/100
    // userId = 5, orderId = 100
    return orderService.findByUserAndOrder(userId, orderId);
}

// Example 3: String path variable
@GetMapping("/products/{category}")
public List<Product> getByCategory(@PathVariable String category) {
    // URL: /products/electronics
    // category = "electronics"
    return productService.findByCategory(category);
}
Enter fullscreen mode Exit fullscreen mode

Real URLs:

/users/123              β†’ userId = 123
/posts/my-first-blog    β†’ slug = "my-first-blog"
/categories/electronics β†’ category = "electronics"
Enter fullscreen mode Exit fullscreen mode

2️⃣ @RequestParam - Query String Mein Data

Kab Use Kare:

  • Filtering, sorting, pagination
  • Optional parameters
  • Search criteria

Examples:

// Example 1: Single parameter
@GetMapping("/products")
public List<Product> search(@RequestParam String name) {
    // URL: /products?name=laptop
    // name = "laptop"
    return productService.searchByName(name);
}

// Example 2: Multiple parameters
@GetMapping("/products")
public List<Product> filter(
    @RequestParam String category,
    @RequestParam Double minPrice,
    @RequestParam Double maxPrice
) {
    // URL: /products?category=electronics&minPrice=1000&maxPrice=5000
    // category = "electronics"
    // minPrice = 1000.0
    // maxPrice = 5000.0
    return productService.filter(category, minPrice, maxPrice);
}

// Example 3: Optional parameter with default value
@GetMapping("/products")
public List<Product> getProducts(
    @RequestParam(defaultValue = "0") int page,
    @RequestParam(defaultValue = "10") int size,
    @RequestParam(required = false) String sortBy
) {
    // URL: /products
    // page = 0, size = 10, sortBy = null

    // URL: /products?page=2&size=20&sortBy=price
    // page = 2, size = 20, sortBy = "price"

    return productService.getAll(page, size, sortBy);
}

// Example 4: Boolean parameter
@GetMapping("/users")
public List<User> getUsers(
    @RequestParam(required = false, defaultValue = "false") boolean active
) {
    // URL: /users
    // active = false

    // URL: /users?active=true
    // active = true

    return userService.findByActive(active);
}
Enter fullscreen mode Exit fullscreen mode

Real URLs:

/products?name=laptop
/products?category=electronics&minPrice=1000
/users?page=2&size=20&sortBy=name
/search?q=spring boot&limit=10
Enter fullscreen mode Exit fullscreen mode

3️⃣ @RequestBody - JSON/XML Body Mein Data

Kab Use Kare:

  • Create/Update operations (POST, PUT, PATCH)
  • Complex data structures
  • Multiple fields bhejne ho

Examples:

// Example 1: Create operation
@PostMapping("/users")
public User createUser(@RequestBody User user) {
    // Request Body (JSON):
    // {
    //   "name": "Raj",
    //   "email": "raj@email.com",
    //   "age": 25
    // }

    return userService.save(user);
}

// Example 2: With validation
@PostMapping("/orders")
public Order createOrder(@Valid @RequestBody OrderRequest request) {
    // Request Body:
    // {
    //   "items": [
    //     {"productId": 1, "quantity": 2},
    //     {"productId": 3, "quantity": 1}
    //   ],
    //   "shippingAddress": "123 Street",
    //   "paymentMethod": "CARD"
    // }

    return orderService.create(request);
}

// Example 3: Update operation
@PutMapping("/products/{id}")
public Product updateProduct(
    @PathVariable Long id,
    @RequestBody ProductUpdateRequest request
) {
    // URL: /products/10
    // Request Body:
    // {
    //   "name": "Updated Name",
    //   "price": 999.99,
    //   "stock": 50
    // }

    return productService.update(id, request);
}

// Example 4: List of objects
@PostMapping("/bulk-users")
public List<User> createBulkUsers(@RequestBody List<User> users) {
    // Request Body:
    // [
    //   {"name": "User1", "email": "user1@email.com"},
    //   {"name": "User2", "email": "user2@email.com"}
    // ]

    return userService.saveAll(users);
}
Enter fullscreen mode Exit fullscreen mode

Request Body Example:

POST /api/users
Content-Type: application/json

{
  "name": "Raj Kumar",
  "email": "raj@example.com",
  "phone": "9876543210",
  "address": {
    "street": "123 Main St",
    "city": "Mumbai"
  }
}
Enter fullscreen mode Exit fullscreen mode

4️⃣ @RequestHeader - HTTP Headers Mein Data

Kab Use Kare:

  • Authentication tokens
  • API keys
  • Request metadata
  • User identification

Examples:

// Example 1: Authorization token
@GetMapping("/profile")
public User getProfile(@RequestHeader("Authorization") String token) {
    // Header: Authorization: Bearer xyz123token
    // token = "Bearer xyz123token"

    return userService.getProfileByToken(token);
}

// Example 2: Custom headers
@PostMapping("/orders")
public Order createOrder(
    @RequestHeader("X-User-Id") Long userId,
    @RequestHeader("X-Request-Id") String requestId,
    @RequestBody OrderRequest request
) {
    // Headers:
    // X-User-Id: 123
    // X-Request-Id: abc-def-ghi

    log.info("Request {} from user {}", requestId, userId);
    return orderService.create(userId, request);
}

// Example 3: Optional header with default
@GetMapping("/data")
public String getData(
    @RequestHeader(value = "Accept-Language", defaultValue = "en") String language
) {
    // Header: Accept-Language: hi
    // language = "hi"

    // No header sent:
    // language = "en"

    return dataService.getByLanguage(language);
}

// Example 4: API Key validation
@GetMapping("/api/products")
public List<Product> getProducts(
    @RequestHeader("X-API-Key") String apiKey
) {
    // Header: X-API-Key: my-secret-key-123

    if (!isValidApiKey(apiKey)) {
        throw new UnauthorizedException("Invalid API key");
    }

    return productService.findAll();
}
Enter fullscreen mode Exit fullscreen mode

Request Headers Example:

GET /api/profile
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
X-User-Id: 123
Accept-Language: hi
Content-Type: application/json
Enter fullscreen mode Exit fullscreen mode

🎯 Complete Example - Sabhi 4 Ek Saath:

@RestController
@RequestMapping("/api/orders")
public class OrderController {

    @Autowired
    private OrderService orderService;

    /**
     * Search orders with all 4 input types
     */
    @GetMapping("/{orderId}")
    public ResponseEntity<Order> getOrderDetails(

        // 1️⃣ PATH VARIABLE - Order ID
        @PathVariable Long orderId,

        // 2️⃣ QUERY PARAM - Include items flag
        @RequestParam(defaultValue = "false") boolean includeItems,

        // 3️⃣ HEADER - User authentication
        @RequestHeader("Authorization") String authToken,

        // 4️⃣ HEADER - User ID
        @RequestHeader("X-User-Id") Long userId

    ) {
        // Validate token
        validateToken(authToken);

        // Fetch order
        Order order = orderService.getOrderById(orderId, userId, includeItems);

        return ResponseEntity.ok(order);
    }

    /**
     * Create order - combining inputs
     */
    @PostMapping
    public ResponseEntity<Order> createOrder(

        // 1️⃣ BODY - Order data (main data)
        @Valid @RequestBody OrderRequest orderRequest,

        // 2️⃣ HEADER - User ID
        @RequestHeader("X-User-Id") Long userId,

        // 3️⃣ QUERY PARAM - Apply coupon
        @RequestParam(required = false) String couponCode

    ) {
        Order order = orderService.create(userId, orderRequest, couponCode);

        return ResponseEntity
                .status(HttpStatus.CREATED)
                .body(order);
    }

    /**
     * Update order status
     */
    @PatchMapping("/{orderId}/status")
    public ResponseEntity<Order> updateStatus(

        // 1️⃣ PATH VARIABLE - Which order
        @PathVariable Long orderId,

        // 2️⃣ BODY - New status data
        @RequestBody StatusUpdateRequest request,

        // 3️⃣ HEADER - Admin token
        @RequestHeader("Authorization") String adminToken,

        // 4️⃣ QUERY PARAM - Send notification?
        @RequestParam(defaultValue = "true") boolean notify

    ) {
        validateAdminToken(adminToken);

        Order updated = orderService.updateStatus(
            orderId, 
            request.getStatus(), 
            notify
        );

        return ResponseEntity.ok(updated);
    }
}
Enter fullscreen mode Exit fullscreen mode

πŸ“Š Quick Decision Chart:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Kis Situation Mein Kya Use Kare?                   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                     β”‚
β”‚  Resource identify (ID)      β†’ @PathVariable       β”‚
β”‚  /users/123                                         β”‚
β”‚                                                     β”‚
β”‚  Filters, pagination         β†’ @RequestParam       β”‚
β”‚  ?page=1&size=10&status=active                     β”‚
β”‚                                                     β”‚
β”‚  Create/Update data          β†’ @RequestBody        β”‚
β”‚  { "name": "...", "age": 25 }                      β”‚
β”‚                                                     β”‚
β”‚  Auth, API keys, metadata    β†’ @RequestHeader      β”‚
β”‚  Authorization: Bearer token                        β”‚
β”‚                                                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Enter fullscreen mode Exit fullscreen mode

βœ… Yaad Rakhne Ka Formula:

1. URL mein ID/resource?           β†’ @PathVariable
2. ? ke baad filters/options?      β†’ @RequestParam
3. JSON body mein complex data?    β†’ @RequestBody
4. Authorization/metadata?         β†’ @RequestHeader
Enter fullscreen mode Exit fullscreen mode

Bas yeh 4 cheezein master karo, sab controller samajh aa jayega! πŸš€

Top comments (0)