🏷 HTTP
3 patterns
Topic: HTTP
All Java patterns related to HTTP — java.evolved
Concurrency
Concurrent HTTP with virtual threads
Old
ExecutorService pool =
Executors.newFixedThreadPool(10);
List<Future<String>> futures =
urls.stream()
.map(u -> pool.submit(
() -> fetchUrl(u)))
.toList();
// manual shutdown, blocking get()
Modern
try (var exec = Executors
.newVirtualThreadPerTaskExecutor()) {
var results = urls.stream()
.map(u -> exec.submit(
() -> client.send(req(u),
ofString()).body()))
.toList().stream()
.map(Future::join).toList();
}
hover to see modern →
JDK 21+
learn more →
I/O
Modern HTTP client
Old
URL url = new URL("https://api.com/data");
HttpURLConnection con =
(HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
// read lines, close streams...
Modern
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.com/data"))
.build();
var response = client.send(
request, BodyHandlers.ofString());
String body = response.body();
hover to see modern →
JDK 11+
learn more →
Tooling
Built-in HTTP server
Old
// Install and configure a web server
// (Apache, Nginx, or embedded Jetty)
// Or write boilerplate with com.sun.net.httpserver
HttpServer server = HttpServer.create(
new InetSocketAddress(8080), 0);
server.createContext("/", exchange -> { ... });
server.start();
Modern
// Terminal: serve current directory
$ jwebserver
// Or use the API (JDK 18+)
var server = SimpleFileServer.createFileServer(
new InetSocketAddress(8080),
Path.of("."),
OutputLevel.VERBOSE);
server.start();
hover to see modern →
JDK 18+
learn more →