http/https connections in Java
You have three choices for working with http or https in Java.
1. You can can use the HttpUrlConnection class. It supports only HTTP/1.1 protocol. This means that we can send only one request per TCP connection. Also HttpUrlConnection works only in synchronous mode. This means you must explicitly execute request in background thread if necessary, for example, for android platform.
The HttpsUrlConnection class handles the https request. If you don't need https specific functionality, you can work with hppts request via HttpUrlConnection. Both classes are implementations of the UrlConnection mark> interface.
2. Java 9 introduces new http client and in Java 11 it was standardized. It supports both HTTP/1.1 and HTTP/2.0. Also it works in both synchronous and asynchronous mode.
3. Use any popular library like OkHttp:
- supports HTTP/2, all requests to the same host share the same socket
- transparent GZIP shrinks download sizes
- response caching avoids the network completely for repeat requests
- works in both synchronous and asynchronous mode
- works on Android 5.0+ (API level 21+) and on Java 8+
Below example of reading text from url in synchronous mode.
String readText(String argUrl) throws IOException {
URL url = new URL(argUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// set some connection parameters
conn.setConnectTimeout(5000);
conn.setInstanceFollowRedirects(true);
// set some http headers
conn.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
conn.addRequestProperty("User-Agent", "Mozilla...");
try {
int responseCode = conn.getResponseCode();
// handle redirection
if (responseCode == HttpURLConnection.HTTP_MOVED_PERM
|| responseCode == HttpURLConnection.HTTP_MOVED_TEMP) {
conn = redirect(conn);
} else if (responseCode >= 200 && responseCode < 300) {
// read response as text
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(conn.getInputStream()))) {
StringBuilder sb = new StringBuilder();
String line = reader.readLine();
while (line != null) {
// todo add progress listener if necessary
sb.append(line);
line = reader.readLine();
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
} else handleError(conn);
} finally {
conn.disconnect(); // can be omitted if keep-alive supported
}
return null;
}
// import jdk.incubator.http.* // Java 9
// Java 11
java.net.http.*
// ...
String readText(String argUrl){
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.followRedirects(SECURE)
.build();
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(URI.create(argUrl))
.header("Accept-Language", "en-US,en;q=0.8")
.header("User-Agent", "Mozilla...")
.build();
HttpResponse<String> response = client.send(
request,
BodyHandlers.ofString());
String responseBody = response.body();
return responseBody;
}
OkHttpClient client = new OkHttpClient();
String readText(String argUrl){
try{
Request request = new Request.Builder()
.url(argUrl)
.addHeader("Accept-Language", "en-US,en;q=0.8")
.addHeader("User-Agent", "Mozilla...")
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}catch(Exception e){
return null
}
}