diff --git a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/config/RestApiConfig.java b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/config/RestApiConfig.java new file mode 100644 index 0000000..7af94c3 --- /dev/null +++ b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/config/RestApiConfig.java @@ -0,0 +1,23 @@ +package ru.dragonestia.loadbalancer.web.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +import java.util.function.Supplier; + +@Configuration +public class RestApiConfig { + + @Bean + RestTemplateBuilder restTemplateBuilder() { + return new RestTemplateBuilder(); + } + + @Bean + Supplier restTemplate(@Autowired RestTemplateBuilder builder) { + return builder::build; + } +} diff --git a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/repository/impl/RestUtil.java b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/repository/impl/RestUtil.java new file mode 100644 index 0000000..18ad604 --- /dev/null +++ b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/repository/impl/RestUtil.java @@ -0,0 +1,78 @@ +package ru.dragonestia.loadbalancer.web.repository.impl; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import java.net.URI; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.function.Consumer; +import java.util.function.Supplier; + +@Component +@RequiredArgsConstructor +public class RestUtil { + + private final URI serverUrl; + private final Supplier restTemplate; + + public T get(URI uri, Class responseType) { + var template = restTemplate.get(); + return Objects.requireNonNull(template.getForObject(serverUrl.resolve(uri), responseType)); + } + + public T get(URI uri, Class responseType, Consumer> paramsConsumer) { + var params = new HashMap(); + paramsConsumer.accept(params); + + var template = restTemplate.get(); + return Objects.requireNonNull(template.getForObject(buildPath(uri, params.keySet()), + responseType, + params)); + } + + public T post(URI uri, Class responseType, Consumer> paramsConsumer) { + var params = new HashMap(); + paramsConsumer.accept(params); + + var template = restTemplate.get(); + return Objects.requireNonNull(template.postForObject(buildPath(uri, params.keySet()), + null, + responseType, + params)); + } + + public void put(URI uri, Consumer> paramsConsumer) { + var params = new HashMap(); + paramsConsumer.accept(params); + + var template = restTemplate.get(); + template.put(buildPath(uri, params.keySet()), params); + } + + public void delete(URI uri, Consumer> paramsConsumer) { + var params = new HashMap(); + paramsConsumer.accept(params); + + var template = restTemplate.get(); + template.delete(buildPath(uri, params.keySet()), params); + } + + private String buildPath(URI uri, Collection paramKeys) { + var path = new StringBuilder(serverUrl.resolve(uri) + "?"); + int left = paramKeys.size(); + for (var key: paramKeys) { + path.append(key); + path.append("={"); + path.append(key); + path.append("}"); + if (--left > 0) { + path.append("&"); + } + } + return path.toString(); + } +}