Episode ini membahas networking dan HTTP di Java: socket programming dengan java.net.Socket dan ServerSocket, HTTP API modern dengan java.net.http.HttpClient, membuat request GET dan POST, konsumsi API REST, serta asynchronous request dengan CompletableFuture.

Hampir tidak ada aplikasi modern yang berjalan sendirian. Aplikasi berkomunikasi dengan layanan lain melalui jaringan dan HTTP. Episode 12 membahas networking dasar dan HTTP client di Java — dari socket level rendah hingga HttpClient modern untuk konsumsi API REST.
Socket programming adalah fondasi komunikasi jaringan. ServerSocket mendengarkan koneksi masuk di sebuah port:
import java.io.*;
import java.net.*;
public class ServerSederhana {
public static void main(String[] args) throws IOException {
try (ServerSocket server = new ServerSocket(8080)) {
System.out.println("Menunggu koneksi di port 8080");
try (Socket klien = server.accept();
PrintWriter out = new PrintWriter(klien.getOutputStream(), true)) {
out.println("Halo dari server");
}
}
}
}server.accept() memblokir hingga ada klien yang terhubung.
Sisi klien menggunakan Socket untuk terhubung:
import java.io.*;
import java.net.*;
public class ClientSederhana {
public static void main(String[] args) throws IOException {
try (Socket socket = new Socket("localhost", 8080);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()))) {
System.out.println("Server bilang: " + in.readLine());
}
}
}Java 11 memperkenalkan java.net.http.HttpClient yang modern — menggantikan HttpURLConnection yang kuno. HttpClient mendukung HTTP/2, request synchronous dan asynchronous, serta WebSocket:
import java.net.http.*;
import java.time.Duration;
public class ClientHttp {
public static void main(String[] args) {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
System.out.println("HttpClient siap");
}
}Kirim request GET dan baca respons sebagai string:
import java.net.*;
import java.net.http.*;
public class GetRequest {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.github.com/users/arman"))
.header("Accept", "application/json")
.GET()
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println("Status: " + response.statusCode());
System.out.println(response.body());
}
}client.send(request, HttpResponse.BodyHandlers.ofString()) mengirim request secara sinkron dan mengembalikan respons.
Untuk mengirim data, gunakan POST dengan body JSON dan header Content-Type:
import java.net.*;
import java.net.http.*;
public class PostRequest {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
String json = "{\"nama\":\"Produk Baru\",\"harga\":15000}";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/produk"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println("Status: " + response.statusCode());
}
}HttpRequest.BodyPublishers.ofString(json) mengemas string JSON sebagai body request.
sendAsync mengirim request tanpa memblokir thread dan mengembalikan CompletableFuture:
import java.net.*;
import java.net.http.*;
import java.util.concurrent.CompletableFuture;
public class AsyncRequest {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/data"))
.GET()
.build();
CompletableFuture<HttpResponse<String>> future =
client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
future.thenAccept(resp -> {
System.out.println("Status: " + resp.statusCode());
System.out.println(resp.body());
});
System.out.println("Program lanjut tanpa menunggu");
Thread.sleep(3000);
}
}client.sendAsync(request, ...) mengembalikan future yang bisa dikomposisi. Callback thenAccept berjalan saat respons tiba tanpa memblokir thread utama.
Episode 12 membekali kalian networking: socket programming dengan ServerSocket dan Socket, HttpClient modern untuk HTTP/2, request GET dan POST untuk konsumsi REST API, serta asynchronous request dengan CompletableFuture.
Inti yang harus dibawa pulang:
client.send untuk sinkron; sendAsync untuk asynchronous.BodyPublishers.ofString.Di episode 13 selanjutnya kita akan membahas keamanan aplikasi dan cryptography dasar — konsep otentikasi dan otorisasi, Java Cryptography Architecture untuk hashing dan enkripsi, manajemen key-store, secure random, dan TLS sederhana, serta best practice keamanan. Saatnya mengamankan aplikasi!