How can we make asynchronous REST api call in Java?
43,944
Solution 1
The correct approach is to execute the async with a callback (using DeferredResult, like this (assuming we have a class someClass
that we want to retrieve from the API:
@GetMapping(path = "/testingAsync")
public DeferredResult<String> value() throws ExecutionException, InterruptedException, TimeoutException {
AsyncRestTemplate restTemplate = new AsyncRestTemplate();
String baseUrl = "http://someUrl/blabla";
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
String value = "";
HttpEntity entity = new HttpEntity("parameters", requestHeaders);
final DeferredResult<String> result = new DeferredResult<>();
ListenableFuture<ResponseEntity<someClass>> futureEntity = restTemplate.getForEntity(baseUrl, someClass.class);
futureEntity.addCallback(new ListenableFutureCallback<ResponseEntity<someClass>>() {
@Override
public void onSuccess(ResponseEntity<someClass> result) {
System.out.println(result.getBody().getName());
result.setResult(result.getBody().getName());
}
@Override
public void onFailure(Throwable ex) {
result.setErrorResult(ex.getMessage());
}
});
return result;
}
Solution 2
If you use Java 11, java support asynchronous HTTP Client. Asynchronous client using CompletableFuture in the back. You can see javadoc.
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://openjdk.java.net/"))
.timeout(Duration.ofMinutes(1))
.header("Content-Type", "application/json")
.POST(BodyPublishers.ofFile(Paths.get("file.json")))
.build();
client.sendAsync(request, BodyHandlers.ofString())
.thenApply(response -> { System.out.println(response.statusCode());
return response; } )
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
Author by
user10937286
Updated on November 03, 2020Comments
-
user10937286 over 3 years
I am using Spring RestTemplate and want to make a call to another service that doesn't return any response body. So, I don't want to wait for the response. So, it's just fire and forget, and continue with the remaining code. I am thinking of creating a new Thread to do this but really not sure what's the correct approach.
-
viswa over 4 yearsIt's throwing error as 'org.springframework.http.ResponseEntity cannot be cast to org.springframework.util.concurrent.ListenableFuture' for this line "ListenableFuture<ResponseEntity<InitiateEventResponseVO>> response = restTemplate.postForEntity(url, request, InitiateEventResponseVO.class);
-
Pravin over 3 years
AsyncRestTemplate
is Deprecated -
Dhana over 3 yearsAsyncRestTemplate is deprecated.
-
Soham about 3 yearsAs Pravin mentioned, AsyncRestTemplate is deprecated.