java 11 LTS
Java had HttpURLConnection
class for long time for HTTP communication. But over the time, requirements have gone complex and more demanding in applications. Before Java 11, developers had to resort to feature-rich libraries like Apache HttpComponents or OkHttp etc.
HttpURLConnection API已经出现一段时间,
但随着时间的推移,应用程序的需求变得越来越复杂,要求也越来越高。开发者不得不使用像
HttpComponents or OkHttp 等组件开发。
Synchronous request example
package org.example;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class SynchronousRequest {
public static void main(String[] args) throws IOException, InterruptedException {
HttpClient httpClient =
HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(10))
.build();
String urlEndpoint = "https://postman-echo.com/get";
URI uri = URI.create(urlEndpoint + "?foo1=bar1&foo2=bar2");
HttpRequest request = HttpRequest.newBuilder().uri(uri).build();
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Status code: " + response.statusCode());
System.out.println("Headers: " + response.headers().allValues("content-type"));
System.out.println("Body: " + response.body());
}
}
Asynchronous Request example
package org.example;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.List;
import java.util.concurrent.*;
import java.util.stream.Stream;
import static java.util.stream.Collectors.toList;
public class AsynchronousRequest {
public static void main(String[] args) {
final List<URI> uris =
Stream.of("https://www.google.com/", "https://www.github.com/", "https://www.yahoo.com/")
.map(URI::create)
.collect(toList());
HttpClient httpClient =
HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.executor(
new ThreadPoolExecutor(
5,
10,
60,
TimeUnit.SECONDS,
new ArrayBlockingQueue(1000),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy()))
.followRedirects(HttpClient.Redirect.ALWAYS)
.build();
CompletableFuture[] futures =
uris.stream().map(uri -> verifyUri(httpClient, uri)).toArray(CompletableFuture[]::new);
CompletableFuture.allOf(futures).join();
}
private static CompletableFuture<Void> verifyUri(HttpClient httpClient, URI uri) {
HttpRequest request = HttpRequest.newBuilder().timeout(Duration.ofSeconds(5)).uri(uri).build();
return httpClient
.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::statusCode)
.thenApply(statusCode -> statusCode == 200)
.exceptionally(ex -> false)
.thenAccept(
valid -> {
if (valid) {
System.out.println("[SUCCESS] Verified " + uri);
} else {
System.out.println("[FAILURE] Could not " + "verify " + uri);
}
});
}
}
结论: 使用方法和okhttp非常相似