18- RESTful Web Servisleri ve Spring REST

### REST Prensipleri


REST (Representational State Transfer), web servisleri için bir tasarım yaklaşımıdır. REST, HTTP protokolünü kullanarak stateless (durumsuz) etkileşimleri teşvik eder ve aşağıdaki temel prensiplere dayanır:


1. **Stateless (Durumsuzluk)**: Her istekte tüm gerekli bilgi, istemciden sunucuya gönderilir. Sunucu, önceki istekler hakkında herhangi bir bilgi tutmaz.


2. **Client-Server (İstemci-Sunucu)**: İstemci ve sunucu arasındaki sorumluluklar ayrıdır. İstemci, kullanıcı arayüzü ve deneyimi ile ilgilenirken, sunucu veri işleme ve depolama ile ilgilenir.


3. **Cacheable (Önbelleğe Alınabilirlik)**: Yanıtlar önbelleğe alınabilir, bu da performansı artırabilir ve ağ trafiğini azaltabilir.


4. **Uniform Interface (Birim Arayüz)**: REST, standart HTTP metodlarını (GET, POST, PUT, DELETE) ve URI (Uniform Resource Identifier) yapılarını kullanarak kaynaklarla etkileşime geçer.


5. **Layered System (Katmanlı Sistem)**: RESTful sistemler, çeşitli katmanlara ayrılabilir. Bu, sistemin ölçeklenmesini ve yönetilmesini kolaylaştırır.


6. **Code on Demand (Opsiyonel)**: Sunucu, istemciye kod (örneğin, JavaScript) gönderebilir. Bu, istemcinin işlevselliğini genişletir, ancak bu özellik genellikle kullanılmaz.


---


### Spring RESTful Servis Giştişimi


Spring Framework, RESTful web servisleri oluşturmak için kapsamlı destek sağlar. Spring Boot ile, RESTful servislerinizi hızla geliştirebilirsiniz.


#### Basit Spring Boot RESTful Servisi


**`HelloController.java`**


```java

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;


@RestController

@RequestMapping("/api")

public class HelloController {


    @GetMapping("/hello")

    public String sayHello() {

        return "Hello, World!";

    }

}

```


- **`@RestController`**: RESTful web servislerini oluşturur.

- **`@RequestMapping("/api")`**: Tüm metodlar için temel URL yolunu belirtir.

- **`@GetMapping("/hello")`**: HTTP GET isteklerini işaretler ve yanıt verir.


#### JSON ve XML Veri Formatları ile Çalışma


Spring Boot, JSON ve XML veri formatlarını işlemek için çeşitli araçlar sağlar. JSON, varsayılan veri formatıdır, ancak XML desteği de eklenebilir.


1. **JSON Veri Formatı**


Spring Boot, JSON ile veri alışverişini varsayılan olarak destekler. JSON, veri alışverişinde yaygın olarak kullanılan hafif bir veri formatıdır.


**JSON Örneği**


```json

{

    "id": 1,

    "name": "John Doe",

    "email": "john.doe@example.com"

}

```


**`User.java`**


```java

public class User {

    private Long id;

    private String name;

    private String email;


    // Getter ve Setter metodları

}

```


**`UserController.java`**


```java

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;


@RestController

@RequestMapping("/api")

public class UserController {


    @GetMapping("/user")

    public User getUser() {

        User user = new User();

        user.setId(1L);

        user.setName("John Doe");

        user.setEmail("john.doe@example.com");

        return user;

    }

}

```


- **`@GetMapping("/user")`**: `User` nesnesini JSON formatında döner.


2. **XML Veri Formatı**


Spring Boot XML veri formatını desteklemek için `jackson-dataformat-xml` kütüphanesini kullanır.


**`pom.xml`**


```xml

<dependency>

    <groupId>com.fasterxml.jackson.dataformat</groupId>

    <artifactId>jackson-dataformat-xml</artifactId>

</dependency>

```


**`UserController.java`**


```java

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.http.MediaType;


@RestController

@RequestMapping("/api")

public class UserController {


    @GetMapping(value = "/user", produces = MediaType.APPLICATION_XML_VALUE)

    public User getUser() {

        User user = new User();

        user.setId(1L);

        user.setName("John Doe");

        user.setEmail("john.doe@example.com");

        return user;

    }

}

```


- **`produces = MediaType.APPLICATION_XML_VALUE`**: Yanıtın XML formatında olduğunu belirtir.


**XML Örneği**


```xml

<User>

    <id>1</id>

    <name>John Doe</name>

    <email>john.doe@example.com</email>

</User>

```


---


### Özet


REST, web servisleri için bir tasarım yaklaşımıdır ve HTTP protokolü üzerinden veri alışverişini yönetir. Spring Framework ve Spring Boot, RESTful servislerinizi hızlıca geliştirmenizi sağlar. JSON, varsayılan veri formatı olarak kullanılırken, XML desteği eklenebilir. Bu bilgiler, RESTful web servislerinizi oluştururken ve veri formatları ile çalışırken size yardımcı olacaktır.