diff --git a/Spring-Boot/spring-boot-rest-template/.gitignore b/Spring-Boot/spring-boot-rest-template/.gitignore
new file mode 100644
index 0000000..549e00a
--- /dev/null
+++ b/Spring-Boot/spring-boot-rest-template/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/Spring-Boot/spring-boot-rest-template/.mvn/wrapper/maven-wrapper.jar b/Spring-Boot/spring-boot-rest-template/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000..c1dd12f
Binary files /dev/null and b/Spring-Boot/spring-boot-rest-template/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/Spring-Boot/spring-boot-rest-template/.mvn/wrapper/maven-wrapper.properties b/Spring-Boot/spring-boot-rest-template/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..b7cb93e
--- /dev/null
+++ b/Spring-Boot/spring-boot-rest-template/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
diff --git a/Spring-Boot/spring-boot-rest-template/pom.xml b/Spring-Boot/spring-boot-rest-template/pom.xml
new file mode 100644
index 0000000..b6194ba
--- /dev/null
+++ b/Spring-Boot/spring-boot-rest-template/pom.xml
@@ -0,0 +1,63 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.6.3
+
+
+ com.javadevjournal
+ spring-boot-rest-template
+ 0.0.1-SNAPSHOT
+ spring-boot-rest-template
+ spring-boot-rest-template
+
+ 1.8
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ com.h2database
+ h2
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.apache.httpcomponents
+ httpclient
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
+
+
+
diff --git a/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/SpringBootRestTemplateApplication.java b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/SpringBootRestTemplateApplication.java
new file mode 100644
index 0000000..9d88070
--- /dev/null
+++ b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/SpringBootRestTemplateApplication.java
@@ -0,0 +1,52 @@
+package com.javadevjournal.springbootresttemplate;
+
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+@SpringBootApplication
+public class SpringBootRestTemplateApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootRestTemplateApplication.class, args);
+ }
+
+ @Bean
+ RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+
+ @Bean("restTemplateWithTimeout")
+ RestTemplate restTemplateWithTimeout() {
+ return new RestTemplate(getClientHttpRequestFactory());
+ }
+
+ ClientHttpRequestFactory getClientHttpRequestFactory() {
+ int timeout = 5000;
+ HttpComponentsClientHttpRequestFactory clientHttpRequestFactory
+ = new HttpComponentsClientHttpRequestFactory();
+ clientHttpRequestFactory.setConnectTimeout(timeout);
+ return clientHttpRequestFactory;
+ }
+
+ ClientHttpRequestFactory getClientHttpRequestFactoryV1() {
+ int timeout = 5000;
+ RequestConfig config = RequestConfig.custom()
+ .setConnectTimeout(timeout)
+ .setConnectionRequestTimeout(timeout)
+ .setSocketTimeout(timeout)
+ .build();
+ CloseableHttpClient client = HttpClientBuilder
+ .create()
+ .setDefaultRequestConfig(config)
+ .build();
+ return new HttpComponentsClientHttpRequestFactory(client);
+ }
+
+}
\ No newline at end of file
diff --git a/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/controller/EmployeeController.java b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/controller/EmployeeController.java
new file mode 100644
index 0000000..6943a4d
--- /dev/null
+++ b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/controller/EmployeeController.java
@@ -0,0 +1,49 @@
+package com.javadevjournal.springbootresttemplate.controller;
+
+import com.javadevjournal.springbootresttemplate.model.Employee;
+import com.javadevjournal.springbootresttemplate.service.EmployeeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+public class EmployeeController {
+
+ @Autowired
+ EmployeeService employeeService;
+
+ @GetMapping("/employees")
+ private List getAllEmployees() {
+ return employeeService.getAllEmployees();
+ }
+
+ @GetMapping("/employees/{id}")
+ private Employee getEmployeeById(@PathVariable("id") int id) {
+ return employeeService.getEmployeeById(id);
+ }
+
+ @PostMapping("/employees")
+ private Employee createEmployee(@RequestBody Employee employee) {
+ employeeService.saveOrUpdate(employee);
+ return employee;
+ }
+
+ @PutMapping("/employees/{id}")
+ private Employee updateEmployee(@PathVariable("id") int id, @RequestBody Employee employee) {
+ Employee updatedEmployee = employeeService.getEmployeeById(id);
+ updatedEmployee.setName(employee.getName());
+ updatedEmployee.setSalary(employee.getSalary());
+ employeeService.saveOrUpdate(updatedEmployee);
+ return updatedEmployee;
+ }
+
+ @DeleteMapping("/employees/{id}")
+ private Employee deleteById(@PathVariable("id") int id) {
+ Employee employeeDeleted = employeeService.getEmployeeById(id);
+ employeeService.delete(id);
+ return employeeDeleted;
+ }
+}
diff --git a/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/controller/RestTemplateController.java b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/controller/RestTemplateController.java
new file mode 100644
index 0000000..f88c425
--- /dev/null
+++ b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/controller/RestTemplateController.java
@@ -0,0 +1,108 @@
+package com.javadevjournal.springbootresttemplate.controller;
+
+import com.javadevjournal.springbootresttemplate.model.Employee;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.*;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.client.RestTemplate;
+import java.util.*;
+
+@RestController
+public class RestTemplateController {
+ private final String URI_EMPLOYEE = "http://localhost:8081/employees/";
+ private final String URI_EMPLOYEE_ID = "http://localhost:8081/employees/{id}";
+
+ @Autowired
+ RestTemplate restTemplate;
+
+ @GetMapping("/v1/allEmployees")
+ public ResponseEntity getAllV1() {
+ Employee[] EmployeesArray = restTemplate.getForObject(URI_EMPLOYEE, Employee[].class);
+ return new ResponseEntity<>(Arrays.asList(EmployeesArray), HttpStatus.OK);
+ }
+
+ @GetMapping("/v1/employees/{id}")
+ public ResponseEntity getByIdV1(@PathVariable final Integer id) {
+ Map params = new HashMap<>();
+ params.put("id", String.valueOf(id));
+ Employee Employee = restTemplate.getForObject(URI_EMPLOYEE_ID, Employee.class, params);
+ return new ResponseEntity<>(Employee, HttpStatus.OK);
+ }
+
+ @GetMapping("/v2/allEmployees")
+ public ResponseEntity getAllV2() {
+ ResponseEntity responseEntity = restTemplate.getForEntity(URI_EMPLOYEE, Employee[].class);
+ return responseEntity;
+ }
+
+ @GetMapping("/v2/employees/{id}")
+ public ResponseEntity getByIdV2(@PathVariable final Integer id) {
+ Map params = new HashMap<>();
+ params.put("id", String.valueOf(id));
+ ResponseEntity responseEntity
+ = restTemplate.getForEntity(URI_EMPLOYEE_ID, Employee.class, params);
+ return responseEntity;
+ }
+
+ @GetMapping("/v3/allEmployees")
+ public ResponseEntity getAllV3() {
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
+ HttpEntity entity = new HttpEntity<>(httpHeaders);
+ return restTemplate.exchange(URI_EMPLOYEE, HttpMethod.GET, entity, Employee[].class);
+ }
+
+ @GetMapping("/v3/employees/{id}")
+ public ResponseEntity getByIdV3(@PathVariable final Integer id) {
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
+ HttpEntity entity = new HttpEntity<>(httpHeaders);
+ return restTemplate.exchange(URI_EMPLOYEE + id, HttpMethod.GET, entity, Employee.class);
+ }
+
+ @PostMapping("/v1/employees")
+ public ResponseEntity createV1(@RequestBody final Employee newEmployee) {
+ Employee createdEmployee = restTemplate.postForObject(URI_EMPLOYEE, newEmployee, Employee.class);
+ return new ResponseEntity(createdEmployee, HttpStatus.CREATED);
+ }
+
+ @PostMapping("/v2/employees")
+ public ResponseEntity createV2(@RequestBody final Employee newEmployee) {
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
+ HttpEntity entity = new HttpEntity<>(newEmployee, httpHeaders);
+ return restTemplate.exchange(URI_EMPLOYEE, HttpMethod.POST, entity, Employee.class);
+ }
+
+ @PutMapping("/v1/employees/{id}")
+ public ResponseEntity updateEmployeeV1(@PathVariable final Integer id, @RequestBody Employee newEmployee) {
+ Map params = new HashMap<>();
+ params.put("id", String.valueOf(id));
+ restTemplate.put(URI_EMPLOYEE_ID, newEmployee, params);
+ return new ResponseEntity("Employee Updated with id " + id, HttpStatus.OK);
+ }
+
+ @PutMapping("/v2/employees/{id}")
+ public ResponseEntity updateEmployeeV2(@PathVariable final Integer id, @RequestBody Employee newEmployee) {
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
+ HttpEntity entity = new HttpEntity<>(newEmployee, httpHeaders);
+ return restTemplate.exchange(URI_EMPLOYEE + id, HttpMethod.PUT, entity, Employee.class);
+ }
+
+ @DeleteMapping("/v1/employees/{id}")
+ public ResponseEntity deleteV1(@PathVariable final Integer id) {
+ Map params = new HashMap<>();
+ params.put("id", String.valueOf(id));
+ restTemplate.delete(URI_EMPLOYEE_ID, params);
+ return new ResponseEntity<>("Employee deleted with id " + id, HttpStatus.OK);
+ }
+
+ @DeleteMapping("/v2/employees/{id}")
+ public ResponseEntity deleteV2(@PathVariable final Integer id) {
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
+ HttpEntity entity = new HttpEntity<>(httpHeaders);
+ return restTemplate.exchange(URI_EMPLOYEE + id, HttpMethod.DELETE, entity, Employee.class);
+ }
+}
diff --git a/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/model/Employee.java b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/model/Employee.java
new file mode 100644
index 0000000..a59d3a3
--- /dev/null
+++ b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/model/Employee.java
@@ -0,0 +1,36 @@
+package com.javadevjournal.springbootresttemplate.model;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "EMPLOYEE")
+public class Employee implements Serializable {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ Integer id;
+ String name;
+ Double salary;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Double getSalary() {
+ return salary;
+ }
+
+ public void setSalary(Double salary) {
+ this.salary = salary;
+ }
+}
+
diff --git a/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/repository/EmployeeRepository.java b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/repository/EmployeeRepository.java
new file mode 100644
index 0000000..4f7c0ff
--- /dev/null
+++ b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/repository/EmployeeRepository.java
@@ -0,0 +1,9 @@
+package com.javadevjournal.springbootresttemplate.repository;
+
+import com.javadevjournal.springbootresttemplate.model.Employee;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface EmployeeRepository extends JpaRepository {
+}
diff --git a/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/service/EmployeeService.java b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/service/EmployeeService.java
new file mode 100644
index 0000000..c37da13
--- /dev/null
+++ b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/service/EmployeeService.java
@@ -0,0 +1,34 @@
+package com.javadevjournal.springbootresttemplate.service;
+
+import com.javadevjournal.springbootresttemplate.model.Employee;
+import com.javadevjournal.springbootresttemplate.repository.EmployeeRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class EmployeeService {
+
+ @Autowired
+ EmployeeRepository employeeRepository;
+
+ public List getAllEmployees() {
+ List employees = new ArrayList();
+ employeeRepository.findAll().forEach(employee -> employees.add(employee));
+ return employees;
+ }
+
+ public Employee getEmployeeById(int id) {
+ return employeeRepository.findById(id).get();
+ }
+
+ public void saveOrUpdate(Employee employee) {
+ employeeRepository.save(employee);
+ }
+
+ public void delete(int id) {
+ employeeRepository.deleteById(id);
+ }
+}
diff --git a/Spring-Boot/spring-boot-rest-template/src/main/resources/application.properties b/Spring-Boot/spring-boot-rest-template/src/main/resources/application.properties
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/Spring-Boot/spring-boot-rest-template/src/main/resources/application.properties
@@ -0,0 +1 @@
+
diff --git a/Spring-Boot/spring-boot-rest-template/src/test/java/com/javadevjournal/springbootresttemplate/SpringBootRestTemplateApplicationTests.java b/Spring-Boot/spring-boot-rest-template/src/test/java/com/javadevjournal/springbootresttemplate/SpringBootRestTemplateApplicationTests.java
new file mode 100644
index 0000000..53d35a6
--- /dev/null
+++ b/Spring-Boot/spring-boot-rest-template/src/test/java/com/javadevjournal/springbootresttemplate/SpringBootRestTemplateApplicationTests.java
@@ -0,0 +1,13 @@
+package com.javadevjournal.springbootresttemplate;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class SpringBootRestTemplateApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}