Obsługa wywołania zew. usługi

0

Czesc ,
ucze się javy i springa (głównie z tutoriali, czasem książka).
Chciałem napisać w ramach nauki serwis, który łączy się do zew. usługi i pobiera jakieś dane. Dla was pewno prosta sprawa, ale mi osobiscie ciężko znaleźć przykład, który w miare kompleksowo pokrywa temat (czyli również logowanie, obsługa błędów, w miare czysty kod itd).
Zatem byłbym wdzięczny za wskazanie głupot, ewentualnie jeśli jest ich zbyt dużo to pokazanie jakiegoś przykładu, żebym wiedział jak to przepisać.
moje założenia :

  • miało być czytelnie
  • chciałem poprawnie użyć httpclient od apache
  • poprawnie obsłużyć błędy (zasadniczo chce przerwać działanie aplikacji i zalogować to co istotne)

kod poniżej

@Slf4j
public class ExternalCallService {

    private final String exteranlServiceUrl;

    public ExternalCallService(String exteranlServiceUrl) {
        this.exteranlServiceUrl = exteranlServiceUrl;
    }

    ExternalServiceResult callForExternalData(){
        HttpGet request = createRequest();
        String response = executeRequest(request);
        return ExternalServiceResult.of(response);
    }

    private HttpGet createRequest(){
        HttpGet request = new HttpGet();
        request.setURI(URI.create(exteranlServiceUrl));
        return request;
    }

    private String executeRequest(HttpGet httpGet) {
        try(CloseableHttpClient httpClient = HttpClients.createDefault();
            CloseableHttpResponse response = httpClient.execute(httpGet)){
            int httpResponseCode = response.getStatusLine().getStatusCode();
            String result = EntityUtils.toString(response.getEntity());
            return handleResponse(httpResponseCode, result);
        } catch (IOException e) {
            log.error("Exception on sending request", e);
            throw new RuntimeException(e);
        }
    }

    private String handleResponse(int httpStatus, String result){
        if(httpStatusOk(httpStatus)){
            return result;
        } else {
            log.error("Server response : " + result + " : http code : " + httpStatus);
            throw new RuntimeException("Error response from server");
        }
    }
}
3
  1. To co napisałeś to jest raczej ExternalServiceClient ;)
  2. Może Either zamiast RuntimeException? Bo teraz to zrobiłeś tak, że cięzko zrobić jakis ludzki error handling, bo można co najwyżej złapać RuntimeException albo Exception, a te mogą być wygenerowane z różnych miejsc. Jak już musisz rzucać wyjątki, to zrób własne! Ale mimo wszystko Either byłby ładniejszy.
  3. Tego HttpClienta można stworzyć raz, a nie przy każdym requeście od nowa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1