Dùng proxy HTTP trong Java HttpClient
Truyền ProxySelector cho bộ dựng máy khách HTTP của Java và tách riêng thời gian chờ kết nối với thời gian chờ yêu cầu.
Với Java 11 trở lên, đặt ProxySelector trên bộ dựng máy khách. Các thuộc tính proxy cho toàn JVM nhờ đó không bị thay đổi:
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());
}
}Thay đầu cuối minh họa bằng proxy HTTP của bạn; danh sách proxy HTTP cung cấp ứng viên để thử. ProxySelector.of nhận địa chỉ socket: dùng host không có tiền tố http:// và truyền cổng riêng. Nó chọn proxy HTTP, không chọn SOCKS dựa trên số cổng. URI yêu cầu vẫn là đích thực tế.
HTTPS có thể đi qua proxy HTTP này bằng đường hầm. Không cần hạ mức bảo vệ của đích, và thiết lập không hàm ý bộ lắng nghe của chính proxy hỗ trợ TLS.
Thời gian chờ kết nối của bộ dựng áp dụng khi thiết lập kết nối; yêu cầu có thời gian chờ riêng. Giữ cả hai rõ ràng vì yêu cầu có thể tái sử dụng kết nối đã có. Ngoại lệ mạng, xác thực hoặc đường hầm có thể xảy ra trước bất kỳ phản hồi nào của đích, trong khi mã lỗi trả về không nhất thiết gây ngoại lệ.
Tái sử dụng máy khách cho các yêu cầu có cùng chính sách định tuyến để ứng dụng tận dụng việc quản lý kết nối của nó.