Modern Alternatives: java.net.http.HttpClient (HTTP/2, WebSocket Support)
Modern Alternatives: java.net.http.HttpClient (HTTP/2, WebSocket Support)
Introduction to java.net.http.HttpClient
Java के पुराने networking classes जैसे HttpURLConnection या URLConnection कई सालों तक web communication के लिए use किए जाते थे। लेकिन जैसे-जैसे web standards modern हुए, Java ने एक नया और powerful alternative introduce किया — java.net.http.HttpClient।
यह class Java 11 में officially launch की गई थी, और इसका purpose था HTTP/2 protocol और asynchronous communication को easy और efficient बनाना।
Why java.net.http.HttpClient was needed?
पुराने Java networking APIs जैसे HttpURLConnection में कई limitations थीं।
उदाहरण के लिए:
- HTTP/2 protocol का support नहीं था
- Asynchronous requests को handle करना मुश्किल था
- Code बहुत complex और verbose हो जाता था
- Timeouts और redirection control सीमित थे
इन्हीं problems को solve करने के लिए Java ने एक modern, efficient और developer-friendly API बनाई — HttpClient। यह न केवल performance को बढ़ाती है, बल्कि readability और scalability को भी improve करती है।
Core Features of java.net.http.HttpClient
चलो देखते हैं कि HttpClient में कौन-कौन से major features हैं जो इसे इतना powerful बनाते हैं।
- HTTP/2 Protocol Support: यह automatically HTTP/2 connections को handle करता है, जिससे communication fast और efficient होता है।
- Asynchronous Request Handling: इसमें
CompletableFutureका use होता है, जिससे background में request send और response receive किया जा सकता है। - WebSocket API Integration: अब Java direct WebSocket connection establish कर सकता है real-time communication के लिए।
- Better Configuration: Timeout, redirection policy, proxy setting आदि को easily customize किया जा सकता है।
- Immutable and Thread-safe Design: HttpClient objects thread-safe होते हैं, जिससे multi-threaded applications में safe usage possible होता है।
Creating and Configuring HttpClient
HttpClient का object बनाने के लिए हम builder pattern का use करते हैं। यहाँ एक basic example देखो:
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(10))
.followRedirects(HttpClient.Redirect.NORMAL)
.build();
ऊपर के code में हमने एक HTTP/2 supported client बनाया है जो 10 seconds का timeout रखता है और normal redirects को follow करता है। Builder pattern का फायदा यह है कि हम अपने client को पूरी तरह customize कर सकते हैं।
Sending a GET Request using HttpClient
GET request सबसे common होती है जब हम किसी web server से data retrieve करना चाहते हैं। HttpClient के साथ यह बहुत simple है।
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/data"))
.GET()
.build();
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
यह code एक synchronous GET request send करता है और server से response को string के रूप में print करता है।
अगर हम asynchronous version चाहते हैं, तो sendAsync() method का use किया जा सकता है।
Asynchronous GET Request Example
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
इस example में request background में run होती है और response आने के बाद print किया जाता है — main thread block नहीं होता।
Sending a POST Request
POST request तब use होती है जब हमें server को data भेजना होता है। नीचे एक simple example दिया गया है:
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/submit"))
.POST(HttpRequest.BodyPublishers.ofString("name=Ravi&age=22"))
.header("Content-Type", "application/x-www-form-urlencoded")
.build();
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
यह code एक POST request भेजता है जिसमें form data होता है। हम JSON data भेजना चाहें तो बस content type और body बदलनी होगी।
POST Request with JSON Body
String json = "{\"name\":\"Amit\",\"age\":25}";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/users"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
यह method APIs से interact करने के लिए बहुत useful है, खासकर जब हम RESTful services के साथ काम करते हैं।
HTTP/2 Support in HttpClient
HTTP/2 एक modern web protocol है जो multiplexing, header compression और better connection management support करता है। HttpClient automatically HTTP/2 connection establish करता है अगर server support करता हो।
- Multiplexing: Multiple requests एक single connection पर parallel जा सकती हैं।
- Header Compression: Data transfer fast होता है क्योंकि headers compressed form में भेजे जाते हैं।
- Server Push: Server proactively resources भेज सकता है जो client को future में चाहिए हों।
ये features performance को काफी बढ़ाते हैं, खासकर जब web applications heavy content load करती हैं।
WebSocket Support in HttpClient
Java के पुराने versions में WebSocket के लिए अलग library की जरूरत होती थी, लेकिन अब HttpClient के अंदर ही WebSocket API integrated है। इससे हम real-time communication जैसे chat apps, live updates और streaming data को आसानी से handle कर सकते हैं।
Example: Simple WebSocket Connection
HttpClient client = HttpClient.newHttpClient();
WebSocket webSocket = client.newWebSocketBuilder()
.uri(URI.create("wss://echo.websocket.org"))
.buildAsync(new WebSocket.Listener() {
@Override
public void onOpen(WebSocket webSocket) {
System.out.println("Connection opened");
webSocket.sendText("Hello WebSocket!", true);
}
@Override
public CompletionStage> onText(WebSocket webSocket, CharSequence data, boolean last) {
System.out.println("Received: " + data);
return null;
}
}).join();
यह code एक echo WebSocket server से connect करता है, message भेजता है और response receive करता है। इससे आप समझ सकते हैं कि HttpClient अब सिर्फ HTTP communication तक सीमित नहीं है, बल्कि real-time data transfer के लिए भी powerful बन चुका है।
Advantages of java.net.http.HttpClient
| Feature | Benefit |
|---|---|
| HTTP/2 Support | Fast, multiplexed and efficient communication |
| Asynchronous Mode | Non-blocking operations with CompletableFuture |
| Built-in WebSocket | Real-time bidirectional communication |
| Clean and Simple API | Readable and maintainable code |
| Configurable Settings | Timeout, redirect, proxy — all customizable |
Practical Use Cases
- RESTful API consumption (GET, POST, PUT, DELETE)
- Real-time data updates using WebSocket
- Server status monitoring tools
- Async background tasks like data fetching
- Performance testing and API automation
Comparison: HttpURLConnection vs HttpClient
| Feature | HttpURLConnection | HttpClient |
|---|---|---|
| Protocol Support | Only HTTP/1.1 | HTTP/1.1 and HTTP/2 |
| Asynchronous Support | No | Yes (CompletableFuture) |
| WebSocket | Not Supported | Built-in Support |
| Ease of Use | Complex | Simple and Fluent |
| Performance | Slower | Faster and Optimized |
Exam Focused Notes
- HttpClient Java 11 में introduce किया गया था।
- यह HTTP/2 और WebSocket दोनों को support करता है।
- Asynchronous communication के लिए CompletableFuture use करता है।
- Builder pattern के ज़रिए configuration आसान है।
- पुराने HttpURLConnection का modern alternative है।
- Real-time applications के लिए WebSocket API बहुत useful है।
- Performance के मामले में HttpClient ज्यादा efficient है।
- RESTful APIs के साथ communication के लिए ideal choice है।
- Thread-safe और immutable design इसे reliable बनाता है।
- Exam point of view से, main focus करो HTTP/2 support और asynchronous features पर।