Spring REST Controller
REST Controller demek bizim web uygulaması üzerindeki endpointlere atılan isteği karşılayan ve buna göre yanıt veren classtır.
Biz Spring Boot'da eğer ki classımızın REST Controller olduğunu belirtmek istersek:
@RestController annotationunu belirtmek zorundayız. Bu sayede classımıza REST desteği eklenmiş olur ve endpointleri karşılayabiliriz.
@RequestMapping ile de bizim endpointimiz olan /selamver'i karşılarız ve method yöntemi olan RequestMethod.GET ile de GET isteklerini karşılayacağımızı belirtiriz.
@RestController
public class TeacherController {
@RequestMapping(path="/selamver",method=RequestMethod.GET)
public String getSelamVer(){
return "Selam, gençler. Ayağa kalkın, büyüğünüz geldi";
}
}JSON Jackson Data Binding
Data Binding : JSON (JavaScript Object Notation) verilerini Java POJO (Plain old java object) dönüştürme işlemine denir. Bizim de bu süreçleri Jackson yönetir.
Ayrıca bu süreç isimlerini farklı farklı da bulabiliriz:
- Mapping
- Serialization / Deserialization
- Marshalling / Unmarshalling
Spring bu sürecin arka planında Jackson Projesini kullanır. Jackson bizim için data binding süreci olan JSON'dan Java POJO ve tersini kendisi handle eder.
JSON to Java POJO
Bizim JSON'larımızı Java POJO'ya dönüştürme sürecinde Jackson Java POJO üzerindeki setter methodlarını çağırır.
Bu süreci otomatik olarak gelen JSON değerlerini Java POJO'ya dönüştürmeyi Jackson bizim için yapacaktır.
Java POJO to JSON
Bizim Java POJO'larımızı JSON'a dönüştürmek için Jackson getter methodlarımızı çağıracaktır.
- Jackson desteğini bizim ekstra dışarıdan eklememize gerek yoktur çünkü Spring Boot bunu otomatik olarak ekler.
- JSON verilerimiz REST controllera otomatik olarak Java POJO'ya dönüştürülür.
- Java POJO verilerimiz de REST controllerdan otomatik olaraj JSON'a dönüştürülür.
Spring Boot REST PathVariables ve Request Params
public class Student {
private Long id;
private String firstName;
private String lastName;
public Student() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}Path Variable
Örneğin biz bir tane öğrenciyi almak istersek
/api/students/{studentId}
burdaki {studentId} -> "path variable" olarak bilinir ve bunu REST controllerda bir methoda bind etmek istersek:
@RequestMapping(path="/students/{studentId}",method=RequestMethod.GET)
public Student getStudent(@PathVariable Long studentId){
Student student = new Student("Minter","Coder");
student.setId(studentId);
return student;
}yada alternatif olarak biz specific bir isim verecek olursak örneğin methoddaki parametre ismini değiştireceksek eğer bu sefer @PathVariable annotationuna studentId ismini eklemiz gerekir.
@RequestMapping(path="/students/{studentId}",method=RequestMethod.GET)
public Student getStudent(@PathVariable(name = "studentId") Long theId){
Student student = new Student("Minter","Coder");
student.setId(theId);
return student;
}Request Param
/api/students?studentId=4
burdaki studentId değeri de request param olarak bilinir bunu almak için ise @RequestParam olarak bilinen bir annotation kullanılır.
@RequestMapping(path = "/students", method = RequestMethod.GET)
public Student getStudentRequestParam(@RequestParam(name = "studentId") Long theId) {
Student student = new Student("Minter", "Coder");
student.setId(theId);
return student;
}Görüldüğü üzere biz Student değerini dönmemize rağmen bize direkt olarak JSON döndü çünkü bu süreci yukarıda değindiğimiz gibi Jackson otomatik olarak convert edecektir.
JSON datayı okuma
@RequestMapping(path = "/students", method = RequestMethod.POST)
public ResponseEntity<?> saveStudent(@RequestBody Student student) {
this.studentRepository.save(student);
return ResponseEntity
.status(HttpStatus.CREATED)
.build();
}