Bu yazıda, Spring Boot’ta controller oluşturmanın nasıl yapıldığını ayrıntılı bir şekilde inceleyeceğiz.
Bir web uygulamasında controller, kullanıcının yaptığı isteklere cevap veren bileşendir. HTTP istekleri alır, bu istekleri işler ve genellikle bir yanıt döndürür. Bu yanıt, veritabanı verileri, bir hata mesajı veya başka bir içerik olabilir.
Controller Oluşturma
Spring Boot’ta bir sınıfı controller olarak işaretlemek için @RestController anotasyonunu kullanıyoruz. Bu, sınıfın HTTP taleplerini işleyen metotları içereceğini belirtir.
Örnek olarak, Product adında bir modelimiz olduğunu varsayalım:
1 2 3 4 5 6 7 8 9 |
public class Product { private Long id; private String name; private double price; // Getter ve Setter metotları... } |
Bu model için basit bir controller oluşturalım:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
@RestController @RequestMapping("/api/products") public class ProductController { @PostMapping public String createProduct(@RequestBody Product product) { return "Ürün başarıyla oluşturuldu!"; } @GetMapping public String getProducts() { // Normalde bir veritabanından ürün listesi alınır. return "Tüm ürünler listelendi!"; } @GetMapping("/{id}") public String getProduct(@PathVariable Long id) { return "Ürün detayları: " + id; } @PutMapping("/{id}") public String updateProduct(@PathVariable Long id, @RequestBody Product product) { return "Ürün güncellendi: " + id; } @PatchMapping("/{id}") public String partialUpdateProduct(@PathVariable Long id, @RequestParam Double price) { return "Ürün fiyatı güncellendi: " + price; } @DeleteMapping("/{id}") public String deleteProduct(@PathVariable Long id) { return "Ürün silindi: " + id; } } |
Anotasyonların Detaylı İncelenmesi
@RestController: Bu anotasyon, sınıfın bir controller olduğunu ve yanıtların genellikle JSON ya da XML gibi bir formatla döneceğini belirtir.
@RequestMapping: Bu anotasyon genel bir amaca hizmet eder. HTTP isteğinin türüne (GET, POST, PUT, DELETE vs.) bağlı kalmaksızın bir URL yolu ile bir metodu eşleştirmek için kullanılır. Ayrıca, sınıf seviyesinde de kullanılabilir, bu şekilde tüm metotlar için ortak bir temel yol (base path) tanımlanabilir.
@GetMapping: HTTP GET isteğiyle bir metodu işaret eder. Örneğin, bir ürünün detaylarını getirmek için kullanılır.
1 2 3 4 5 6 |
@GetMapping("/special") public String getSpecialProduct() { return "Özel Ürün"; } |
@PostMapping: HTTP POST isteğiyle bir metodu işaret eder. Yeni bir kaynak oluşturmak için kullanılır.
@PutMapping: HTTP PUT isteğiyle bir metodu işaret eder. Varolan bir kaynağı tamamen güncellemek için kullanılır.
@PatchMapping: HTTP PATCH isteğiyle bir metodu işaret eder. Varolan bir kaynağın sadece belirli kısımlarını güncellemek için kullanılır.
@DeleteMapping: HTTP DELETE isteğiyle bir metodu işaret eder. Bir kaynağı silmek için kullanılır.
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping: Bunlar aslında @RequestMapping’in özel versiyonlarıdır. Spesifik HTTP metotları için kullanılırlar.
Örneğin, @GetMapping sadece HTTP GET istekleri için kullanılır. Bu anotasyonlar sayesinde kod daha okunaklı hale gelir.
@RequestMapping:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@RestController @RequestMapping("/products") // Sınıf seviyesinde temel yol tanımlama public class ProductController { @RequestMapping(value = "/list", method = RequestMethod.GET) public List<Product> listProducts() { // ürünlerin listesini döndür } @RequestMapping(value = "/create", method = RequestMethod.POST) public String createProduct(@RequestBody Product product) { // ürün oluşturma } } |
@GetMapping, @PostMapping vs.:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@RestController @RequestMapping("/products") // Sınıf seviyesinde temel yol tanımlama public class ProductController { @GetMapping("/list") public List<Product> listProducts() { // ürünlerin listesini döndür } @PostMapping("/create") public String createProduct(@RequestBody Product product) { // ürün oluşturma } } |
@RequestBody: HTTP isteğinin gövdesindeki içeriği Java nesnesine dönüştürmek için kullanılır. Örneğin, yeni bir ürün oluşturulurken, bu ürünün detaylarını gövdede alabiliriz.
@PathVariable: URL’deki bir değeri almak için kullanılır. Örneğin, belirli bir ürünün detaylarını getirmek için bu ürünün ID’sini URL’den alabiliriz.
@RequestParam: URL’deki sorgu parametrelerini almak için kullanılır.
1 2 3 4 5 6 7 8 |
// http://localhost:8080/search?name=test @GetMapping("/search") public String searchProduct(@RequestParam String name) { return "Aranan ürün: " + name; } |
Yada
1 2 3 4 5 6 7 8 9 10 11 12 |
// http://localhost:8080/posts?userId=3 @GetMapping("/posts") public List<Post> getAllPosts(@RequestParam Optional<Long> userId) { if(userId.isPresent()) { // Optional larda kullanilir. return "User in postlari"; } else { return "Tum post lar"; } } |
@RequestHeader: Spring MVC’de HTTP istek başlıklarını (headers) bir metot parametresi olarak elde etmek için kullanılır. Böylece, bir istemcinin gönderdiği HTTP başlıklarını doğrudan bir controller metodu içerisinde kullanabiliriz.
@RequestHeader kullanımının en yaygın senaryolarından biri, özel bir HTTP başlık değerine göre işlem yapmaktır. Örneğin, dil seçenekleri, kimlik doğrulama bilgileri veya özel client bilgileri gibi başlıklar bu anotasyon ile kolayca alınabilir.
Örnek Kullanım:
Bir istemcinin gönderdiği User-Agent ve özel bir X-Custom-Header başlığını almak isteyelim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
@RestController public class HeaderController { @GetMapping("/headers") public String getHeadersInfo( @RequestHeader("User-Agent") String userAgent, @RequestHeader(name = "X-Custom-Header", required = false) String customHeader) { StringBuilder result = new StringBuilder(); result.append("User-Agent: " + userAgent); if (customHeader != null) { result.append("\nX-Custom-Header: " + customHeader); } else { result.append("\nX-Custom-Header: Başlık bulunamadı."); } return result.toString(); } } |
Bu örnekte:
User-Agent başlığını doğrudan userAgent değişkenine atıyoruz. Bu başlık genellikle istemcinin tarayıcı veya uygulama bilgilerini içerir.
X-Custom-Header adında özel bir başlık alıyoruz. Eğer bu başlık istekte mevcut değilse, null değeri alacaktır, çünkü required özelliğini false olarak ayarladık. Bu özellik başlığın zorunlu olup olmadığını belirtir. Eğer zorunlu (default değeri true) olarak ayarlanmışsa ve başlık gelmezse Spring bir BadRequest hatası döndürür.
Bu şekilde, HTTP başlıklarını kolayca elde edebilir ve uygulamanızın işleyişini bu başlıklara göre özelleştirebilirsiniz.
Umarım “Spring Boot ile Controller Oluşturma” başlıklı yazım sizin için faydalı olmuştur.
Şu yazılar da ilginizi çekebilir.
REST API ve RESTful API Nedir?
Yeni bir yazımda görüşmek üzere.
Happy coding!