Menggunakan proxy HTTP di Java HttpClient
Berikan ProxySelector ke builder klien HTTP Java dan pisahkan timeout koneksi dari timeout permintaan.
Untuk Java 11 atau yang lebih baru, atur ProxySelector pada builder klien. Properti proxy seluruh JVM tetap tidak tersentuh:
import java.net.InetSocketAddress;
import java.net.ProxySelector;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class ProxyExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.proxy(ProxySelector.of(
new InetSocketAddress("203.0.113.10", 8080)))
.connectTimeout(Duration.ofSeconds(5))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/"))
.timeout(Duration.ofSeconds(15))
.GET()
.build();
HttpResponse<String> response = client.send(
request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}Ganti endpoint dokumentasi dengan proxy HTTP Anda; daftar proxy HTTP menyediakan kandidat untuk diuji. ProxySelector.of menerima alamat socket: gunakan host tanpa awalan http:// dan berikan port secara terpisah. Yang dipilih adalah proxy HTTP, bukan SOCKS berdasarkan nomor port. URI permintaan tetap tujuan sebenarnya.
HTTPS dapat melewati proxy HTTP ini melalui tunnel. Tidak perlu menurunkan keamanan tujuan, dan pengaturan ini tidak berarti listener proxy itu sendiri mendukung TLS.
Timeout koneksi pada builder klien berlaku saat membentuk koneksi; permintaan punya timeout sendiri. Buat keduanya eksplisit karena permintaan dapat memakai ulang koneksi yang ada. Exception jaringan, autentikasi, atau tunnel dapat terjadi sebelum respons apa pun dari tujuan, sedangkan status error yang dikembalikan belum tentu menimbulkan exception.
Gunakan ulang klien untuk permintaan dengan kebijakan routing yang sama agar aplikasi mendapat manfaat dari pengelolaan koneksinya.