Here’s how you can perform concurrent HTTP requests in Java using HttpClient and CompletableFuture to handle multiple requests asynchronously.
Here’s the Java code:
import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors;
public class Main { private static final HttpClient client = HttpClient.newHttpClient(); public static CompletableFuture<Void> sendRequest(String query) { String apiKey = "YOUR-X-API-KEY"; String url = "https://piloterr.com/api/v2/website/crawler?x_api_key=" + apiKey + "&query=" + query; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .GET() .build(); return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenAccept(response -> { if (response.statusCode() == 200) { System.out.println("Response from " + query + ":\n" + response.body()); } else { System.out.println("Request to " + query + " failed with status code: " + response.statusCode()); } }) .exceptionally(ex -> { System.out.println("Request to " + query + " failed: " + ex.getMessage()); return null; }); } public static void scrapeConcurrently(List<String> urls) { List<CompletableFuture<Void>> futures = urls.stream() .map(Main::sendRequest) .collect(Collectors.toList()); CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); System.out.println("Process Ended"); } public static void main(String[] args) { List<String> urlsToScrape = List.of( "https://www.piloterr.com", "https://www.piloterr.com/blog" ); scrapeConcurrently(urlsToScrape); } }
HttpClient: The HttpClient class is used to send HTTP requests asynchronously.
CompletableFuture: This class provides a way to execute non-blocking, asynchronous operations. Each request is handled as a CompletableFuture, which allows all requests to run concurrently.
CompletableFuture.allOf: Waits for all CompletableFuture objects to complete before continuing. This ensures that all requests finish before the program ends.
Replace "YOUR-X-API-KEY" with your actual API key.
Modify the urlsToScrape list to include the URLs you want to scrape.
Java’s CompletableFuture provides a simple way to run multiple asynchronous operations concurrently, improving performance and reducing response times.
The solution is scalable and can be adapted for a large number of URLs.
This Java code offers an efficient way to handle concurrent HTTP requests, suitable for scenarios requiring high performance and concurrency.