Path vs Query Parameters
@PathVariable, URL PATH ka EK HISSA hai, JO, EK SPECIFIC RESOURCE ko, IDENTIFY karta hai — TYPICALLY, MANDATORY, aur RESOURCE HIERARCHY REPRESENT karta hai (jaise /products/42). @RequestParam, QUERY STRING SE, VALUES LETA hai — TYPICALLY, FILTERING, SORTING, PAGINATION ke liye, OPTIONAL PARAMETERS.
RULE OF THUMB — AGAR EK VALUE, RESOURCE ko, UNIQUELY, IDENTIFY karta hai, WOH, PATH VARIABLE HONA CHAHIYE. AGAR EK VALUE, RESULT ko, FILTER/MODIFY karta hai (LEKIN, RESOURCE ki IDENTITY, CHANGE NAHI karta), WOH, QUERY PARAMETER HONA CHAHIYE.
@GetMapping("/products/{id}") // id = PATH variable, resource identity
public Product getProduct(@PathVariable Long id) { }
@GetMapping("/products") // filtering/sorting = QUERY params, optional
public List<Product> searchProducts(
@RequestParam(required = false) String category,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size,
@RequestParam(required = false) String sortBy
) { }
// GET /products?category=electronics&page=1&sortBy=price- @PathVariable = mandatory, resource identity (jaise /products/{id})
- @RequestParam = optional, filtering/sorting/pagination
- required=false + defaultValue = optional query params, sensible defaults
@PathVariable Long id, AUTOMATICALLY, URL STRING (jaise "42") ko, Long TYPE mein, CONVERT karta hai — AGAR, CONVERSION, FAIL hoती hai (jaise, "/products/abc"), Spring, AUTOMATICALLY, 400 Bad Request, RETURN kar deta hai.
@RequestParam(required = false, defaultValue = "10") int limit — DONO, TOGETHER, EK COMMON, PATTERN hain — IF, CLIENT, PARAMETER, PROVIDE NAHI karta, defaultValue, USE hoती hai. required aur defaultValue, DONO, SAATH mein, TECHNICALLY, REDUNDANT hain (defaultValue hone SE, required, AUTOMATICALLY, false ho jaata hai), LEKIN, CLARITY ke liye, DONO, LIKHE JAATE hain.
@RequestParam(defaultValue = "10") int limit
// Agar client, ?limit=5 bheje, limit = 5
// Agar client, limit param, SKIP kare, limit = 10 (DEFAULT)