Contents

Use @GetMapping to handle HTTP GET requests. Path variables are injected with @PathVariable and query parameters with @RequestParam.

import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/api/products") public class ProductController { private final ProductService productService; public ProductController(ProductService productService) { this.productService = productService; } // GET /api/products @GetMapping public List<Product> getAllProducts() { return productService.findAll(); } // GET /api/products/42 @GetMapping("/{id}") public Product getProduct(@PathVariable Long id) { return productService.findById(id); } // GET /api/products/search?category=electronics&page=0 @GetMapping("/search") public List<Product> search(@RequestParam String category, @RequestParam(defaultValue = "0") int page) { return productService.findByCategory(category, page); } }

@PostMapping handles HTTP POST. Use @RequestBody to deserialise the JSON request body into a Java object.

import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/products") public class ProductController { @PostMapping @ResponseStatus(HttpStatus.CREATED) // returns 201 public Product createProduct(@RequestBody Product product) { return productService.save(product); } }
@RestController @RequestMapping("/api/products") public class ProductController { // PUT /api/products/42 @PutMapping("/{id}") public Product updateProduct(@PathVariable Long id, @RequestBody Product updated) { return productService.update(id, updated); } // DELETE /api/products/42 @DeleteMapping("/{id}") @ResponseStatus(HttpStatus.NO_CONTENT) // returns 204 public void deleteProduct(@PathVariable Long id) { productService.delete(id); } }

Use ResponseEntity<T> when you need full control over the HTTP status code, headers, and body.

import org.springframework.http.ResponseEntity; import java.net.URI; @RestController @RequestMapping("/api/products") public class ProductController { @GetMapping("/{id}") public ResponseEntity<Product> getProduct(@PathVariable Long id) { return productService.findByIdOptional(id) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); // 404 } @PostMapping public ResponseEntity<Product> create(@RequestBody Product product) { Product saved = productService.save(product); URI location = URI.create("/api/products/" + saved.getId()); return ResponseEntity.created(location).body(saved); // 201 + Location header } }