Spring Boot has 3 tools to build and execute HTTP calls: 2 Sync type tools (Spring Boot Web): RestTemplate Weather weather = restTemplate.exchange(url2, GET, buildRequest(request), new ParameterizedTypeReference() {} ).getBody(); List routes = restTemplate.exchange(url, GET, buildRequest(request), new ParameterizedTypeReference>() {} ).getBody(); RestClient <- the newer one, and support fluent style coding Weather weather = restClient.get() .uri(weatherUrl) .retrieve() .onStatus(status -> status.value() == 400, (request, response) ->{ return; }) .body(Weather.class); List routes = customClient.get() .accept(APPLICATION_JSON) .retrieve() .body(new ParameterizedTypeReference>() {}); 1 Async type tools (Spring Boot WebFlux): WebClient --------------------------------------------------------- I can use RestClient 2 ways: build a custom object that lets me manage the request, including customer header to support a correlation id RestClient customClient = RestClient.builder() .requestFactory(new HttpComponentsClientHttpRequestFactory()) .baseUrl(effectUrl) .defaultHeader(CORRELATION_ID_HEADER_NAME, correlationId) .build(); Weather weather = customClient.get() .accept(APPLICATION_JSON) .retrieve() .body(Weather.class); or create a default object RestClient getClient = RestClient.create(); Weather weather2 = getClient.get() .uri(weatherUrl) .retrieve() .body(Weather.class);