From e9661fdf78161ae9b565619b5b280c31b99f1de6 Mon Sep 17 00:00:00 2001 From: atusa17 Date: Sun, 10 Mar 2019 11:48:34 -0600 Subject: [PATCH] PAN-60 created initial RestService --- services/build.gradle | 6 +- .../msudenver/tsp/services/RestService.java | 99 +++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 services/src/main/java/edu/msudenver/tsp/services/RestService.java diff --git a/services/build.gradle b/services/build.gradle index a53319f..05efbeb 100644 --- a/services/build.gradle +++ b/services/build.gradle @@ -19,6 +19,10 @@ repositories { dependencies { compile project(':persistence') - testCompile group: 'junit', name: 'junit', version: '4.12' + compile group: 'org.apache.httpcomponents', name: 'httpcore', version: '4.4.11' + compile group: 'org.apache.httpcomponents', name: 'fluent-hc', version: '4.5.7' + compile group: 'com.google.code.gson', name: 'gson', version: '2.7' compile fileTree(dir: 'lib', include: '**/*.jar') + + testCompile group: 'junit', name: 'junit', version: '4.12' } diff --git a/services/src/main/java/edu/msudenver/tsp/services/RestService.java b/services/src/main/java/edu/msudenver/tsp/services/RestService.java new file mode 100644 index 0000000..d9473a2 --- /dev/null +++ b/services/src/main/java/edu/msudenver/tsp/services/RestService.java @@ -0,0 +1,99 @@ +package edu.msudenver.tsp.services; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpResponse; +import org.apache.http.client.fluent.Request; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Slf4j +@Service +public class RestService { + private static final Gson GSON = new Gson(); + private final RequestFactory requestFactory; + + @Autowired + public RestClient(final RequestFactory requestFactory) { + this.requestFactory = requestFactory; + } + + public boolean delete(final String uri, final Integer connectionTimeout, final Integer socketTimeout, final HttpStatus httpStatus) { + LOG.info("Sending DELETE {}", uri); + final Optional response = send(requestFactory.delete(uri), null, connectionTimeout, socketTimeout); + + return response.isPresent() && response.get().getStatusLine().getStatusCode() == httpStatus.value(); + } + + Optional get(final String uri, final TypeToken type, final Integer connectionTimeout, final Integer socketTimeout, final String auth) { + LOG.info("Sending GET {}", uri); + return send(requestFactory.get(uri), auth, connectionTimeout, socketTimeout, type); + } + + Optional post(final String uri, final String requestJson, final TypeToken type, final Integer connectionTimeout, final Integer socketTimeout) { + LOG.info("Sending POST {} with body: {}", uri, requestJson); + return send(requestFactory.post(uri, requestJson), null, connectionTimeout, socketTimeout, type); + } + + Optional post(final String uri, final String requestJson, final Integer connectionTimeout, final Integer socketTimeout) { + LOG.info("Sending POST {} with body: {}", uri, requestJson); + return send(requestFactory.post(uri, requestJson), null, connectionTimeout, socketTimeout); + } + + Optional put(final String uri, final String requestJson, final TypeToken type, final Integer connectionTimeout, final Integer socketTimeout, final String auth) { + LOG.info("Sending PUT {} with body: {}", uri, requestJson); + return send(requestFactory.put(uri, requestJson), auth, connectionTimeout, socketTimeout, type); + } + + private Optional send(final Request request, final String auth, final Integer connectionTimeout, final Integer socketTimeout, final TypeToken type) { + try { + final Optional optionalHttpResponse = send(request, auth, connectionTimeout, socketTimeout); + if (optionalHttpResponse.isPresent()) { + final HttpResponse httpResponse = optionalHttpResponse.get(); + LOG.info("Received {} response", httpResponse.getStatusLine().getStatusCode()); + + final String jsonResponse = httpResponse.getEntity() == null ? null : EntityUtils.toString(httpResponse.getEntity()); + if (StringUtils.isNotBlank(jsonResponse)) { + final T responses = GSON.fromJson(jsonResponse, type.getType()); + if (responses instanceof List) { + LOG.info("Found {} responses.", ((List) responses).size()); + if (((List) responses).isEmpty()) { + return Optional.empty(); + } + } + + return Optional.ofNullable(responses); + } + } + } catch (final Exception e) { + LOG.error("Could not send request", e); + } + + return Optional.empty(); + } + + private Optional send(final Request request, final String auth, final Integer connectionTimeout, final Integer socketTimeout) { + if (StringUtils.isNotBlank(auth)) { + request.addHeader("Authorization", "Basic " + auth); + } + + try { + return Optional.ofNullable(request.connectTimeout(connectionTimeout) + .socketTimeout(socketTimeout) + .execute() + .returnResponse()); + } catch (final Exception e) { + LOG.error("Could not send request", e); + return Optional.empty(); + } + } +} + +