استفاده از پروکسی HTTP در Java HttpClient
یک ProxySelector به سازنده کلاینت HTTP جاوا بدهید و مهلت اتصال را از مهلت درخواست جدا نگه دارید.
در Java 11 یا جدیدتر، یک ProxySelector روی سازنده کلاینت تنظیم کنید. به این ترتیب ویژگیهای پروکسی کل JVM دستنخورده میمانند:
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());
}
}نقطه پایانی نمونه مستندات را با پروکسی HTTP خود عوض کنید؛ فهرست پروکسی HTTP گزینههایی برای آزمایش دارد. ProxySelector.of آدرس سوکت میگیرد: میزبان را بدون پیشوند http:// بدهید و پورت را جداگانه وارد کنید. این روش پروکسی HTTP انتخاب میکند، نه SOCKS بر اساس شماره پورت. URI درخواست همان مقصد واقعی میماند.
HTTPS میتواند از این پروکسی HTTP با تونل عبور کند. نیازی به کاهش امنیت مقصد نیست و این تنظیم به معنای پشتیبانی خود شنونده پروکسی از TLS نیست.
مهلت اتصال در سازنده کلاینت هنگام ایجاد اتصال اعمال میشود؛ درخواست مهلت خودش را دارد. هر دو را روشن نگه دارید چون درخواست ممکن است اتصال موجود را دوباره استفاده کند. استثنای شبکه، احراز هویت یا تونل ممکن است پیش از هر پاسخی از مقصد رخ دهد، درحالیکه وضعیت خطای بازگشتی الزاماً استثنا ایجاد نمیکند.
برای درخواستهای دارای سیاست مسیریابی یکسان، کلاینت را دوباره استفاده کنید تا برنامه از مدیریت اتصال آن بهره ببرد.