Building REST APIs
REST API mein, @RequestBody incoming JSON ko AUTOMATICALLY Java object mein convert karta hai (Jackson library internally). Return value AUTOMATICALLY JSON mein convert hokar client ko jaata hai. ResponseEntity<T> se PRECISE control milta hai — HTTP status code, headers, aur body sab explicitly set kar sakte ho.
Proper REST API design mein STATUS CODES matter karte hain — 200 (OK, success), 201 (Created, naya resource bana), 204 (No Content, delete successful), 400 (Bad Request, invalid input), 404 (Not Found), 500 (Server Error). Client in codes se OPERATION ka result samajh sakta hai, bina response body PARSE kiye.
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService service;
@PostMapping
public ResponseEntity<User> create(@RequestBody @Valid UserDto dto) {
User user = service.create(dto);
return ResponseEntity.status(HttpStatus.CREATED).body(user); // 201
}
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
return service.findById(id)
.map(ResponseEntity::ok) // 200
.orElse(ResponseEntity.notFound().build()); // 404
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> delete(@PathVariable Long id) {
service.delete(id);
return ResponseEntity.noContent().build(); // 204
}
}- @RequestBody/return value = automatic JSON ↔ Java object conversion
- ResponseEntity<T> = status code + headers + body par PRECISE control
- Proper status codes = 200/201/204/400/404/500, REST best practice
@RequestBody incoming JSON ko Java OBJECT mein DESERIALIZE karta hai (Jackson library internally use hoti hai). @ResponseBody (implicit @RestController mein) Java object ko JSON mein SERIALIZE karके response body mein daalta hai. Ye automatic hai — manual JSON parsing/generation KABHI NAHI likhni padti.
@PostMapping("/users")
public User createUser(@RequestBody UserDto dto) {
// dto AUTOMATICALLY JSON se Java object mein convert ho chuka hai
User user = userService.create(dto);
return user; // AUTOMATICALLY Java object se JSON mein convert hoga
}ResponseEntity<T> se response ka STATUS CODE, HEADERS, aur BODY sab explicitly control kiya ja sakta hai — sirf 200 OK return karने ke bajaye, PROPER REST semantics follow kiye ja sakte hain (201 Created, 404 Not Found, 204 No Content).
@PostMapping("/users")
public ResponseEntity<User> create(@RequestBody UserDto dto) {
User user = userService.create(dto);
return ResponseEntity.status(HttpStatus.CREATED).body(user); // 201
}
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
return userService.findById(id)
.map(ResponseEntity::ok) // 200
.orElse(ResponseEntity.notFound().build()); // 404
}