Spring Framework 7 üzerine inşa edilen Spring Boot 4 üzerinde birkaç güzel özellik bulunmaktadır sırasıyla tek tek inceleyelim.
Native API Versioning
En güzel özelliklerden birisidir. Normalde Spring Boot 4 öncesinde bizler şunları yapıyorduk.
@RequestMapping(method = RequestMethod.GET,"/api/v1/users")
@RequestMapping(method = RequestMethod.GET,"/api/v2/users")Bunu hard code bir şekilde her URL pathine vermek zorundaydık. Eğer ki versiyonlamayı değiştirmek isteseydik örneğin v1 kısmını header'a çekmek isteseydik:
X-API-VERSION: 1şeklinde bunu tekrardan her bir controller'a tek tek yazmak zorundaydık bunun yerine:
Spring Boot amcamız bizim için Native API Versioning özelliğini getirdi çok güzel özelliktir şimdi buna değinelim.
Spring Boot 4 bizler için @RequestMapping yada @GetMapping'e eklemek için version attributesini getirdi. Biz basit bir şekilde api'de kullanmak istediğimiz versiyonun sayısını veriyoruz spring bunu bizim için hallediyor.
Bir classta birden fazla versiyon bulundurma
Varsayalım hello isimli bir endpointimiz olsun. V1 ve V2 versiyonlarında da farklı cevaplar versin bize, bunu kodlamak için:
@RestController
@RequestMapping("/hello")
public class HelloWorldController {
// /api/v1/hello
@RequestMapping(method = RequestMethod.GET, version = "1", produces = MediaType.TEXT_PLAIN_VALUE)
public String sayHelloV1() {
return "Minter Coder Version 1";
}
// /api/v2/hello
@RequestMapping(method = RequestMethod.GET, version = "2", produces = MediaType.TEXT_PLAIN_VALUE)
public String sayHelloV2() {
return "Minter Coder Version 2";
}
}Görüldüğü üzere sonunda artık URL adresleri bu şekilde olur.
V1 -> /api/v1/hello
V2 -> /api/v2/hello
Bütün classı versiyonlama
Eğer ki bütün classın versiyonunu belirtmek istersek bunun için de class bazında version attributesini kullanmamız yeterlidir.
@RestController
@RequestMapping(path = "/hello", version = "3")
public class HelloWorldControllerV3 {
@RequestMapping(produces = MediaType.TEXT_PLAIN_VALUE)
public String sayHello(){
return "Minter Coder versiyon 3";
}
}Burda da artık
V3 -> /api/v3/helloşeklinde olur.
Artık biz bu versiyonlamaları belirttik ve bunları artık user nasıl bizden isteyecek bunu da belirtmemiz gerekiyor configuration dosyamızda.
@Configuration
public class ApiConfig implements WebMvcConfigurer {
@Override
public void configureApiVersioning(ApiVersionConfigurer configurer) {
// URL'de Spring'e hangi versiyonu kullanmamız gerektiğini söylüyoruz.
configurer.usePathSegment(1);
}
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
// Burda da dynamic olarak URL yapısını bizim için oluşturacak.
// "v{version}" burda v1,v2,v3 otomatik bir şekilde olacaktır.
configurer.addPathPrefix("/api/v{version}", HandlerTypePredicate.forAnnotation(RestController.class));
}
}Görüldüğü üzere biz burada /api/v{version}/endpoints şeklinde andık artık bütün süreçler böyle dönecek örneğin:
/api/v1/hello