Spring Boot - RESTful Web Hizmetleri Oluşturma

Spring Boot, kurumsal uygulamalar için RESTful Web Servisleri oluşturmak için çok iyi bir destek sağlar. Bu bölüm, Spring Boot kullanarak RESTful web hizmetleri oluşturma hakkında ayrıntılı olarak açıklanacaktır.

Note - RESTful Web Hizmetleri oluşturmak için, Spring Boot Starter Web bağımlılığını yapı yapılandırma dosyasına eklememiz gerekir.

Maven kullanıcısıysanız, aşağıdaki bağımlılığı sitenize eklemek için aşağıdaki kodu kullanın. pom.xml dosya -

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>    
</dependency>

Gradle kullanıcısıysanız, aşağıdaki bağımlılığı sitenize eklemek için aşağıdaki kodu kullanın: build.gradle dosya.

compile('org.springframework.boot:spring-boot-starter-web')

Tam derleme yapılandırma dosyası için kod Maven build – pom.xml aşağıda verilmiştir -

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>
   
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.RELEASE</version>
      <relativePath/> 
   </parent>
   
   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
   </properties>
   
   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>
   
   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Tam derleme yapılandırma dosyası için kod Gradle Build – build.gradle aşağıda verilmiştir -

buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

Bir RESTful web hizmeti oluşturmaya devam etmeden önce, aşağıdaki ek açıklamalar hakkında bilgi sahibi olmanız önerilir -

Dinlenme Kontrolörü

@RestController ek açıklaması, RESTful web hizmetlerini tanımlamak için kullanılır. JSON, XML ve özel yanıt sunar. Söz dizimi aşağıda gösterilmiştir -

@RestController
public class ProductServiceController { 
}

Eşleştirme İste

@RequestMapping ek açıklaması, REST Uç Noktalarına erişmek için İstek URI'sini tanımlamak için kullanılır. Nesneyi tüketmek ve üretmek için İstek yöntemini tanımlayabiliriz. Varsayılan istek yöntemi GET'tir.

@RequestMapping(value = "/products")
public ResponseEntity<Object> getProducts() { }

Gövde İste

@RequestBody ek açıklaması, istek gövde içerik türünü tanımlamak için kullanılır.

public ResponseEntity<Object> createProduct(@RequestBody Product product) {
}

Yol Değişkeni

@PathVariable ek açıklaması, özel veya dinamik istek URI'sini tanımlamak için kullanılır. İstek URI'sindeki Yol değişkeni, aşağıda gösterildiği gibi süslü ayraçlar {} olarak tanımlanır -

public ResponseEntity<Object> updateProduct(@PathVariable("id") String id) {
}

Parametre İste

@RequestParam ek açıklaması, istek parametrelerini İstek URL'sinden okumak için kullanılır. Varsayılan olarak, gerekli bir parametredir. Burada gösterildiği gibi istek parametreleri için varsayılan değerleri de ayarlayabiliriz -

public ResponseEntity<Object> getProduct(
   @RequestParam(value = "name", required = false, defaultValue = "honey") String name) {
}

GET API

Varsayılan HTTP istek yöntemi GET'tir. Bu yöntem herhangi bir İstek Gövdesi gerektirmez. Özel veya dinamik URL'yi tanımlamak için istek parametreleri ve yol değişkenleri gönderebilirsiniz.

HTTP GET istek yöntemini tanımlayan örnek kod aşağıda gösterilmiştir. Bu örnekte, Ürünü depolamak için HashMap kullandık. Depolanacak ürün olarak bir POJO sınıfı kullandığımızı unutmayın.

Burada, istek URI'si /productsve HashMap deposundan ürün listesini döndürecektir. GET yöntemi REST Endpoint'i içeren denetleyici sınıf dosyası aşağıda verilmiştir.

package com.tutorialspoint.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.tutorialspoint.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();
   static {
      Product honey = new Product();
      honey.setId("1");
      honey.setName("Honey");
      productRepo.put(honey.getId(), honey);
      
      Product almond = new Product();
      almond.setId("2");
      almond.setName("Almond");
      productRepo.put(almond.getId(), almond);
   }
   @RequestMapping(value = "/products")
   public ResponseEntity<Object> getProduct() {
      return new ResponseEntity<>(productRepo.values(), HttpStatus.OK);
   }
}

POST API

HTTP POST isteği, bir kaynak oluşturmak için kullanılır. Bu yöntem, İstek Gövdesi'ni içerir. Özel veya dinamik URL'yi tanımlamak için istek parametreleri ve yol değişkenleri gönderebiliriz.

Aşağıdaki örnek, HTTP POST istek yöntemini tanımlamak için örnek kodu gösterir. Bu örnekte, ürünün POJO sınıfı olduğu Ürünü depolamak için HashMap kullandık.

Burada, istek URI'si /productsve ürünü HashMap havuzuna kaydettikten sonra String'i döndürecektir.

package com.tutorialspoint.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.tutorialspoint.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();
   
   @RequestMapping(value = "/products", method = RequestMethod.POST)
   public ResponseEntity<Object> createProduct(@RequestBody Product product) {
      productRepo.put(product.getId(), product);
      return new ResponseEntity<>("Product is created successfully", HttpStatus.CREATED);
   }
}

PUT API

HTTP PUT isteği, mevcut kaynağı güncellemek için kullanılır. Bu yöntem bir İstek Gövdesi içerir. Özel veya dinamik URL'yi tanımlamak için istek parametreleri ve yol değişkenleri gönderebiliriz.

Aşağıda verilen örnek, HTTP PUT istek yönteminin nasıl tanımlanacağını gösterir. Bu örnekte, ürünün POJO sınıfı olduğu mevcut Ürünü güncellemek için HashMap kullandık.

Burada istek URI'si /products/{id}bu, bir üründen sonra String'i bir HashMap havuzuna döndürecektir. Yol değişkenini kullandığımıza dikkat edin{id} güncellenmesi gereken ürün kimliğini tanımlar.

package com.tutorialspoint.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.tutorialspoint.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();
   
   @RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
   public ResponseEntity<Object> updateProduct(@PathVariable("id") String id, @RequestBody Product product) { 
      productRepo.remove(id);
      product.setId(id);
      productRepo.put(id, product);
      return new ResponseEntity<>("Product is updated successsfully", HttpStatus.OK);
   }   
}

DELETE API

HTTP Silme isteği, mevcut kaynağı silmek için kullanılır. Bu yöntem herhangi bir İstek Gövdesi içermez. Özel veya dinamik URL'yi tanımlamak için istek parametreleri ve yol değişkenleri gönderebiliriz.

Aşağıda verilen örnek, HTTP DELETE istek yönteminin nasıl tanımlanacağını gösterir. Bu örnekte, bir POJO sınıfı olan mevcut ürünü kaldırmak için HashMap kullandık.

İstek URI'si /products/{id}ve ürünü HashMap deposundan sildikten sonra String'i döndürecektir. Yol değişkenini kullandık{id} silinmesi gereken ürün kimliğini tanımlar.

package com.tutorialspoint.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.tutorialspoint.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();
   
   @RequestMapping(value = "/products/{id}", method = RequestMethod.DELETE)
   public ResponseEntity<Object> delete(@PathVariable("id") String id) { 
      productRepo.remove(id);
      return new ResponseEntity<>("Product is deleted successsfully", HttpStatus.OK);
   }
}

Bu bölüm size tüm kaynak kodu setini verir. İlgili işlevleri için aşağıdaki kodlara uyun -

The Spring Boot main application class – DemoApplication.java

package com.tutorialspoint.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
}

The POJO class – Product.java

package com.tutorialspoint.demo.model;

public class Product {
   private String id;
   private String name;

   public String getId() {
      return id;
   }
   public void setId(String id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}

The Rest Controller class – ProductServiceController.java

package com.tutorialspoint.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.tutorialspoint.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();
   static {
      Product honey = new Product();
      honey.setId("1");
      honey.setName("Honey");
      productRepo.put(honey.getId(), honey);
      
      Product almond = new Product();
      almond.setId("2");
      almond.setName("Almond");
      productRepo.put(almond.getId(), almond);
   }
   
   @RequestMapping(value = "/products/{id}", method = RequestMethod.DELETE)
   public ResponseEntity<Object> delete(@PathVariable("id") String id) { 
      productRepo.remove(id);
      return new ResponseEntity<>("Product is deleted successsfully", HttpStatus.OK);
   }
   
   @RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
   public ResponseEntity<Object> updateProduct(@PathVariable("id") String id, @RequestBody Product product) { 
      productRepo.remove(id);
      product.setId(id);
      productRepo.put(id, product);
      return new ResponseEntity<>("Product is updated successsfully", HttpStatus.OK);
   }
   
   @RequestMapping(value = "/products", method = RequestMethod.POST)
   public ResponseEntity<Object> createProduct(@RequestBody Product product) {
      productRepo.put(product.getId(), product);
      return new ResponseEntity<>("Product is created successfully", HttpStatus.CREATED);
   }
   
   @RequestMapping(value = "/products")
   public ResponseEntity<Object> getProduct() {
      return new ResponseEntity<>(productRepo.values(), HttpStatus.OK);
   }
}

Aşağıdaki Maven veya Gradle komutlarını gösterildiği gibi kullanarak yürütülebilir bir JAR dosyası oluşturabilir ve ilkbahar önyükleme uygulamasını çalıştırabilirsiniz -

Maven için aşağıda gösterilen komutu kullanın -

mvn clean install

"BUILD SUCCESS" sonrasında, JAR dosyasını hedef dizinin altında bulabilirsiniz.

Gradle için aşağıda gösterilen komutu kullanın -

gradle clean build

"BUILD SUCCESSFUL" sonrasında, JAR dosyasını build / libs dizini altında bulabilirsiniz.

JAR dosyasını aşağıda gösterilen komutu kullanarak çalıştırabilirsiniz -

java –jar <JARFILE>

Bu, aşağıda gösterildiği gibi Tomcat 8080 bağlantı noktasındaki uygulamayı başlatacaktır -

Şimdi POSTMAN uygulamasında aşağıda gösterilen URL'ye basın ve çıktıyı görün.

GET API URL'si: http://localhost:8080/products

POST API URL'si: http://localhost:8080/products

PUT API URL'si: http://localhost:8080/products/3

DELETE API URL'si: http://localhost:8080/products/3