Cách Sử Dụng Proxy với OkHttp (Hướng Dẫn Đầy Đủ 2026)
Tóm tắt
Một proxy OkHttp được cấu hình trên OkHttpClient.Builder, không phải trên một Request riêng lẻ. Sử dụng .proxy(proxy) cho một lộ trình rõ ràng hoặc để trống để cho proxySelector chọn lộ trình.
Proxy có xác thực cần proxyAuthenticator, trả lời thách thức 407 với Proxy-Authorization. Dừng lại khi tiêu đề đó đã có sẵn để tránh thông tin xác thực sai tạo ra vòng lặp xác thực.
Tái sử dụng các thể hiện OkHttpClient thay vì tạo một cái cho mỗi yêu cầu. Một nhóm nhỏ các client đã được xây dựng cung cấp vòng xoay điểm đến có thể dự đoán mà không làm rơi các nhóm kết nối và nhóm luồng.
HTTPS vẫn đi qua proxy HTTP bằng cách sử dụng CONNECT. Giữ xác minh TLS được bật vì proxy thay đổi lộ trình, không phải yêu cầu chứng chỉ đích.
Chứng minh lộ trình trước khi mở rộng. So sánh địa chỉ IP thoát quan sát được, xác thực phản hồi, và phân loại lỗi kết nối proxy riêng biệt với lỗi HTTP đích.
Proxy OkHttp là gì?
Proxy OkHttp là một máy chủ trung gian được OkHttpClient chọn cho các kết nối HTTP và HTTPS ra ngoài. Ứng dụng gửi lưu lượng đến proxy, proxy sẽ chuyển tiếp đến đích và trả về phản hồi. OkHttp vẫn xử lý các yêu cầu, phản hồi, pooling, thời gian chờ và TLS; proxy kiểm soát lộ trình mạng và địa chỉ IP nguồn hiển thị đến điểm đến.
OkHttp sử dụng mô hình java.net.Proxy của Java. API proxy OkHttp chính thức hiện tại cho biết một rõ ràng có ưu tiên hơn . Nếu không có proxy rõ ràng nào được đặt, bộ chọn có thể lựa chọn một cái từ chính sách hệ thống hoặc ứng dụng. Truyền buộc phải kết nối trực tiếp.
Trải nghiem Nstproxy - Bat dau dung thu mien phi ngay
proxy
proxySelector
Proxy.NO_PROXY
Cấu hình tiêu chuẩn này hoạt động với một cổng nội bộ, một proxy gỡ lỗi, hoặc một điểm cuối được quản lý như Nstproxy Residential Prime Proxies. Một proxy thay đổi định tuyến; nó không cấp quyền truy cập vào tài nguyên hoặc thay thế các giới hạn và điều khoản cụ thể về điểm đến.
Tại sao nên sử dụng một proxy với OkHttp?
Proxy với OkHttp hữu ích khi một ứng dụng Java hoặc Android cần kiểm soát lưu lượng ra, kiểm tra chất lượng cục bộ, xác minh quảng cáo, thu thập dữ liệu công cộng, hoặc phân tách giữa các lớp lưu lượng. Nó cũng có thể làm cho một lộ trình mạng có thể tái tạo: mã sẽ xác định lộ trình đã chọn trong khi các hoạt động có thể thay đổi điểm đến bên ngoài một lần triển khai.
Mô hình phiên nên theo dõi quy trình công việc. Nhiều yêu cầu thuộc về một lượt đăng nhập hoặc luồng thanh toán có thể cần một lộ trình ổn định, trong khi các kiểm tra không có liên quan có thể sử dụng vòng quay. Tổng quan về vòng quay IP của Nstproxy giải thích mô hình mạng đó; ứng dụng vẫn cần sự đồng thời giới hạn, xác thực phản hồi và giới hạn thử lại.
OkHttp được thiết kế để tái sử dụng client. Tái sử dụng một client bảo tồn nhóm kết nối và tài nguyên thực thi của nó. Nếu khối lượng công việc cần các chính sách proxy khác nhau, hãy tạo một số ít client lâu dài — một cho mỗi chính sách hoặc điểm cuối — thay vì xây dựng một client mới cho mỗi cuộc gọi.
Các yêu cầu tiên quyết
Các ví dụ yêu cầu Java 8 hoặc mới hơn, Gradle, OkHttp 5.5.0, một điểm đến được ủy quyền, và một máy chủ và cổng proxy. Kho chứa OkHttp hiện tại liệt kê Java 8+ và Android 5.0+ là các tiêu chuẩn hỗ trợ, trong khi trang thông tin artifact OkHttp trên Maven Central cung cấp metadata phát hành hiện tại.
Giữ các giá trị proxy trong kho lưu trữ bí mật được hỗ trợ bởi môi trường. Các ví dụ đọc PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASSWORD, và TARGET_URL. Tránh ghi lại thông tin xác thực hoặc một điểm cuối đã xác thực hoàn chỉnh.
<h1>Kết Nối OkHttp Qua Nstproxy</h1><pclass="description">Tạo một điểm cuối proxy được xác thực, sau đó gắn nó vào một OkHttpClient có thể tái sử dụng.</p><aclass="cta"href="https://app.nstproxy.com/auth/login?utm_source=official&utm_medium=blog&utm_campaign=/okhttp-proxy/"target="_blank"rel="noopener">Tạo Đường Dẫn Proxy Java</a><tdclass="visual-cell"><divclass="proxy-visual"aria-label="Sơ đồ của một khách hàng kết nối qua Nstproxy"><divclass="mode-pill"><svgclass="link-icon"viewBox="0 0 24 24"aria-hidden="true"><pathd="M10.6 13.4a1 1 0 0 0 1.4 1.4l3.5-3.5a3 3 0 0 0-4.2-4.2L9.5 8.9"fill="none"stroke="currentColor"stroke-width="1.8"stroke-linecap="round"/><pathd="M13.4 10.6a1 1 0 0 0-1.4-1.4l-3.5 3.5a3 3 0 0 0 4.2 4.2l1.8-1.8"fill="none"stroke="currentColor"stroke-width="1.8"stroke-linecap="round"/></svg> Dính Chặt
</div><divclass="client-card"><divclass="monitor"></div><divclass="client-label">Khách hàng</div></div><spanclass="line-client"></span><divclass="nst-card"><svgclass="hex-logo"viewBox="0 0 64 64"aria-hidden="true"><pathd="M32 4 56 18v28L32 60 8 46V18Z"fill="none"stroke="#1e5eff"stroke-width="3"/><pathd="M23 43V21l18 22V21"fill="none"stroke="#1e5eff"stroke-width="3"stroke-linecap="round"stroke-linejoin="round"/></svg><divclass="nst-label">Nstproxy</div></div><spanclass="line-main"></span><spanclass="junction"></span><spanclass="country-rail"></span><spanclass="country-dot us"></span><spanclass="country-dot de"></span><spanclass="country-dot sg"></span><divclass="country-card us"><spanclass="flag">🇺🇸</span>Hoa Kỳ</div><divclass="country-card de"><spanclass="flag">🇩🇪</span>ĐỨC</div><divclass="country-card sg"><spanclass="flag">🇸🇬</span>SG</div></div></td>
## Cách Sử Dụng Proxy Với OkHttp
Có ba phương pháp sử dụng proxy thực tiễn với OkHttp: gắn một proxy rõ ràng, trả lời một thử thách xác thực proxy, hoặc luân phiên qua một bể khách hàng có thể tái sử dụng. Mỗi ví dụ Java dưới đây được biên dịch và thực thi với OkHttp 5.5.0 chống lại một proxy cục bộ được xây dựng theo mục đích. Các bài kiểm tra xác nhận các yêu cầu HTTP theo hình thức tuyệt đối, một lần thử lại xác thực 407 thành công và định tuyến xác định qua hai điểm cuối.
### Phương pháp 1: Cấu hình Một Proxy Rõ Ràng
Sử dụng một proxy rõ ràng khi mỗi yêu cầu từ một khách hàng nên theo cùng một lộ trình. Tạo một `Proxy` Java, gắn nó vào trình tạo và giới hạn cả thời gian kết nối và tổng thời gian gọi.
```java
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.time.Duration;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public final class BasicProxy {
public static void main(String[] args) throws Exception {
String proxyHost = requireEnv("PROXY_HOST");
int proxyPort = Integer.parseInt(requireEnv("PROXY_PORT"));
String targetUrl = System.getenv().getOrDefault(
"TARGET_URL", "https://httpbin.org/ip");
Proxy proxy = new Proxy(
Proxy.Type.HTTP,
new InetSocketAddress(proxyHost, proxyPort));
OkHttpClient client = new OkHttpClient.Builder()
.proxy(proxy)
.connectTimeout(Duration.ofSeconds(5))
.callTimeout(Duration.ofSeconds(15))
.build();
Request request = new Request.Builder().url(targetUrl).build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IllegalStateException("Trạng thái không mong đợi: " + response.code());
}
System.out.println(response.body().string());
}
}
private static String requireEnv(String name) {
String value = System.getenv(name);
if (value == null || value.isBlank()) {
throw new IllegalArgumentException(name + " là bắt buộc");
}
return value;
}
}
Bài kiểm tra được thực hiện trả về HTTP 200 và cho thấy GET http://example.test/ip HTTP/1.1 tại proxy cục bộ. Đối với một mục tiêu HTTPS, OkHttp trước tiên yêu cầu một proxy HTTP tạo một đường hầm với CONNECT và sau đó thực hiện TLS với điểm đến thông qua đường hầm đó. Không tắt xác thực chứng chỉ để giải quyết một vấn đề định tuyến hoặc CA cục bộ.
Phương pháp 2: Thêm Tên Người Dùng và Mật Khẩu Xác Thực Proxy
Sử dụng proxyAuthenticator khi điểm cuối yêu cầu xác thực proxy cơ bản. Bộ xác thực chạy sau khi proxy trả về 407 Yêu Cầu Xác Thực Proxy; nó nên thêm thông tin đăng nhập một lần và dừng nếu yêu cầu giống nhau đã có tiêu đề này.
Máy chủ xác minh proxy cố ý trả về 407 trong yêu cầu đầu tiên. OkHttp đã gọi đến trình xác thực, thử lại một lần, và proxy xác nhận rằng yêu cầu thứ hai chứa ủy quyền hợp lệ. Bảo vệ vòng lặp là quan trọng: việc trả về yêu cầu khác sau khi thông tin xác thực đã thất bại có thể lặp lại những thách thức cho đến khi giới hạn theo dõi của OkHttp được đạt tới.
Thông tin xác thực proxy khác với thông tin xác thực đích. Sử dụng proxyAuthenticator cho thử thách 407 của proxy và authenticator cho thử thách 401 của máy chủ gốc. Không bao giờ gửi Proxy-Authorization như một header đích thông thường.
Phương pháp 3: Luân phiên nhóm các điểm cuối proxy
Sử dụng các khách hàng đã được xây dựng khi ứng dụng cần lựa chọn giữa một số điểm cuối khác nhau. Ví dụ này giữ một khách hàng có thể tái sử dụng cho mỗi điểm cuối và chọn chúng theo thứ tự vòng tròn. Việc luân phiên từ phía nhà cung cấp thông qua một cổng thường đơn giản hơn; việc luân phiên từ phía khách hàng là hữu ích khi danh tính và sức khỏe của điểm cuối cần phải vẫn được hiển thị cho ứng dụng.
importjava.net.InetSocketAddress;importjava.net.Proxy;importjava.time.Duration;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.atomic.AtomicInteger;importokhttp3.OkHttpClient;importokhttp3.Request;importokhttp3.Response;publicfinalclassRotatingProxy{privatefinalList<OkHttpClient> clients;privatefinalAtomicInteger next =newAtomicInteger();privateRotatingProxy(List<InetSocketAddress> endpoints){this.clients =newArrayList<>();for(InetSocketAddress endpoint : endpoints){Proxy proxy =newProxy(Proxy.Type.HTTP, endpoint); clients.add(newOkHttpClient.Builder().proxy(proxy).connectTimeout(Duration.ofSeconds(5)).callTimeout(Duration.ofSeconds(15)).build());}}privateOkHttpClientnextClient(){return clients.get(Math.floorMod(next.getAndIncrement(), clients.size()));}publicstaticvoidmain(String[] args)throwsException{String proxyHost =requireEnv("PROXY_HOST");String[] ports =requireEnv("PROXY_PORTS").split(",");String targetUrl =System.getenv().getOrDefault("TARGET_URL","https://httpbin.org/ip");List<InetSocketAddress> endpoints =newArrayList<>();for(String port : ports){ endpoints.add(newInetSocketAddress(proxyHost,Integer.parseInt(port.trim())));}if(endpoints.size()<2){thrownewIllegalArgumentException("Ít nhất hai cổng proxy là bắt buộc");}RotatingProxy pool =newRotatingProxy(endpoints);Request request =newRequest.Builder().url(targetUrl).build();for(int i =0; i < endpoints.size(); i++){try(Response response = pool.nextClient().newCall(request).execute()){if(!response.isSuccessful()){
ném mới một IllegalStateException("Trạng thái không mong đợi: " + response.code());
}
System.out.println(response.body().string());
}
}
}
private static String requireEnv(String name) {
String value = System.getenv(name);
if (value == null || value.isBlank()) {
throw new IllegalArgumentException(name + " là bắt buộc");
}
return value;
}
}
Chạy trực tiếp đã báo cáo các cổng proxy `18180` và `18182` theo thứ tự đó. Trong môi trường sản xuất, hãy lưu một ID điểm cuối không bí mật bên cạnh mỗi client, ghi lại thành công và độ trễ theo ID, và tạm thời cách ly các điểm cuối thường xuyên thất bại. Đừng in URL điểm cuối nếu nó chứa thông tin đăng nhập.
## Proxy rời rạc so với ProxySelector
Sử dụng `.proxy(proxy)` cho một chính sách client cố định và `proxySelector` cho định tuyến nhận thức theo đích. Một bộ chọn có thể trả về các giá trị Java `Proxy` khác nhau cho các URI khác nhau và nhận thông báo `connectFailed`. Tài liệu <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/net/Proxy.html" rel="nofollow noopener"><strong>java.net.Proxy documentation</strong></a> định nghĩa các đại diện proxy HTTP, SOCKS và trực tiếp.
Đừng cấu hình cả hai và mong đợi chúng sẽ kết hợp. OkHttp chỉ tham khảo `proxySelector` khi proxy rõ ràng là null. Nếu một dịch vụ phải bỏ qua proxy cho các máy chủ nội bộ, hãy tạo một client trực tiếp hoặc triển khai một bộ chọn mà phương thức `select(URI)` của nó trả về `Proxy.NO_PROXY` cho những máy chủ đó. Điều này rõ ràng hơn là dựa vào một cài đặt không được chú ý trên toàn bộ máy.
`ProxySelector` có thể cung cấp các tuyến dự phòng, nhưng nó không tự động trở thành một động cơ xoay vòng theo yêu cầu. Tái sử dụng kết nối và phục hồi tuyến đường ảnh hưởng đến việc tuyến được sử dụng nào. Sử dụng một cổng nhà cung cấp cho xoay vòng cấp mạng hoặc một nhóm client cố ý khi mỗi cuộc gọi ứng dụng phải có lựa chọn điểm cuối có thể kiểm tra.
## Cách xác minh proxy OkHttp
Xác minh proxy OkHttp bằng cách kiểm tra tuyến đường và phản hồi cùng nhau. Gửi một yêu cầu trực tiếp và một yêu cầu qua proxy đến một điểm cuối phản chiếu IP hợp lệ, sau đó so sánh các địa chỉ nguồn được báo cáo. Một trạng thái thành công đơn thuần không chứng minh rằng proxy đã xử lý cuộc gọi.
Xác thực trạng thái phản hồi, loại nội dung, và các trường cơ thể cần thiết. Một trung gian hoặc đích có thể trả về một trang khối HTML với HTTP 200. Tài liệu [glossary yêu cầu HTTP](https://www.nstproxy.com/glossary/http-request) là một tài liệu tham khảo hữu ích cho ranh giới yêu cầu/phản hồi.
Tiếp theo, thử nghiệm các chế độ thất bại. Sử dụng một cổng không hợp lệ để xác nhận thời gian kết nối, thông tin đăng nhập không hợp lệ để xác nhận kết quả 407 bị giới hạn, và một mục tiêu được ủy quyền chậm để xác nhận thời gian gọi. Các bộ nghe sự kiện OkHttp có thể ghi lại DNS, kết nối, TLS và thời gian phản hồi mà không tiết lộ thông tin bí mật. Để có cái nhìn của ngôn ngữ khác về cùng một tuyến đường, hướng dẫn proxy Guzzle [Guzzle proxy guide](https://www.nstproxy.com/blog/guzzle-proxy) cung cấp một kiểm tra đối chiếu hữu ích.
## Chọn tuyến đường Nstproxy cho OkHttp
Nstproxy Residential Prime Proxies phù hợp với các ứng dụng OkHttp cần một tuyến đường dân cư đã xác thực với điều khiển phiên và vị trí được phơi bày bởi quy trình làm việc sản phẩm hiện tại. Java chỉ cần một máy chủ tiêu chuẩn, cổng, tên người dùng và mật khẩu; không cần SDK cụ thể của nhà cung cấp cho kết nối proxy. Xem qua [các mô hình thanh toán Residential Prime hiện tại](https://www.nstproxy.com/pricing/residential) và kiểm tra mục tiêu chính xác trước khi chọn một tuyến đường cho sản xuất.
- **Ưu tiên một cổng khi nhà cung cấp xử lý việc xoay vòng.** Nó giữ cho cấu hình OkHttp nhỏ và duy trì việc sử dụng lại client.
- **Sử dụng hành vi dính cho các phiên nhiều yêu cầu.** Giữ các cuộc gọi liên quan trên một tuyến đường cho cửa sổ phiên yêu cầu.
- **Chỉ sử dụng một nhóm ứng dụng khi cần kiểm soát cấp điểm cuối.** Thêm theo dõi sức khỏe, thử lại có giới hạn, và các định danh tuyến đường không bí mật trước khi tăng tính đồng thời.
Một ứng dụng Android có thể sử dụng cùng một API builder OkHttp, nhưng việc phát hành thông tin đăng nhập proxy lâu dài bên trong một nhị phân di động là rủi ro. Ưu tiên thông tin đăng nhập ngắn hạn hoặc một lớp mạng phía máy chủ khi có thể. Xem bài viết [Đánh giá máy chủ proxy Android](https://www.nstproxy.com/blog/best-proxy-server-for-android) để tìm các lựa chọn thay thế ở cấp độ nền tảng.
## Các lỗi và cách khắc phục proxy OkHttp phổ biến
Các lỗi proxy OkHttp dễ dàng khắc phục nhất khi lớp kết nối tách biệt với phản hồi đích.
| Triệu chứng | Nguyên nhân khả thi | Cách khắc phục thực tế |
|---|---|---|
| `407 Cần xác thực proxy` | Thiếu hoặc từ chối thông tin đăng nhập proxy | Xác nhận tên người dùng/mật khẩu, sử dụng `proxyAuthenticator`, và dừng lại sau khi tiêu đề đã được thử nghiệm. |
| Thời gian kết nối hoặc `ConnectException` | Máy chủ/cổng sai, tuyến đường không thể tiếp cận, hoặc chính sách mạng | Xác minh điểm cuối và giữ một `connectTimeout` ngắn; không thử lại vô thời hạn. |
| Lỗi bắt tay TLS | Cấu hình tin cậy không hợp lệ, can thiệp, hoặc không khớp tên máy chủ | Sửa chữa CA hoặc tuyến đường; giữ kiểm tra chứng chỉ và tên máy chủ được kích hoạt. |
| Proxy không được sử dụng | `Proxy.NO_PROXY` rõ ràng, chính sách selector, hoặc một client khác xử lý cuộc gọi | Ghi lại một ID client/route không bí mật và so sánh kết quả IP xuất ra trực tiếp và qua proxy. |
| `403` hoặc `429` | Điểm đến từ chối hoặc hạn chế yêu cầu | Giảm tần suất yêu cầu, xác nhận quyền truy cập, và tuân theo quy tắc của điểm đến. |
| Nỗ lực 407 lặp lại | Trình xác thực trả về một yêu cầu mới sau khi thông tin đăng nhập đã thất bại | Trả về `null` khi `Proxy-Authorization` đã có mặt. |
Chỉ thử lại các lỗi tạm thời và sử dụng cách tiếp cận lùi. Đối với các yêu cầu thay đổi trạng thái, thêm bảo vệ idempotency trước khi thử lại. Một IP proxy mới không thể biến một yêu cầu không hợp lệ thành hợp lệ.
## Kết luận
Cấu hình proxy OkHttp sạch nhất là một `Proxy` rõ ràng cho một route ổn định, `proxyAuthenticator` cho một thử thách 407, hoặc một bộ nhỏ các client tái sử dụng cho vòng quay endpoint có thể kiểm tra. Giữ thông tin đăng nhập bên ngoài nguồn, sử dụng thời gian chờ giới hạn, bảo tồn xác minh TLS, và xác nhận cả route xuất và ngữ nghĩa phản hồi.
Bắt đầu với một điểm đến được ủy quyền và một endpoint. Ghi lại một cơ sở thành công, sau đó thêm logic vòng quay hoặc selector chỉ khi ứng dụng có thể xác định các route thất bại và đưa ra quyết định quay lại có chủ ý.
## Trải nghiệm Nstproxy — Bắt đầu dùng thử miễn phí ngay hôm nay
Tạo một endpoint xác thực, kết nối một client OkHttp tái sử dụng, và xác minh route quan sát được trước khi mở rộng.
<a style="margin: 8px; display: inline-block; text-decoration: none; border-left-width: 0px;" href="https://app.nstproxy.com/auth/login?utm_source=official&utm_medium=blog&utm_campaign=/okhttp-proxy/">
<div style="font-weight:bold; max-width:400px; padding:12px 40px; background:#646AEE; border-radius:5px; border:2px solid #646AEE; color:#fff; font-size:18px;">
Thử Nstproxy miễn phí →
</div>
</a>
## FAQ
**Q: Làm thế nào để tôi thiết lập một proxy trong OkHttp?**
Tạo một `java.net.Proxy` với loại proxy và `InetSocketAddress`, sau đó truyền nó vào `new OkHttpClient.Builder().proxy(proxy).build()`. Tái sử dụng client tạo ra cho các cuộc gọi chia sẻ route đó.
**Q: Làm thế nào để tôi thêm tên người dùng và mật khẩu proxy trong OkHttp?**
Cấu hình `proxyAuthenticator` và trả về một yêu cầu theo sau chứa `Proxy-Authorization`, thường được xây dựng với `Credentials.basic(user, password)`. Trả về `null` nếu header đó đã có mặt để ngăn chặn sự cố gắng thất bại lặp lại.
**Q: OkHttp có hỗ trợ HTTPS qua một proxy HTTP không?**
Có. OkHttp sử dụng phương pháp HTTP CONNECT để tạo một đường hầm qua proxy, sau đó thực hiện TLS với điểm đến. Route proxy không biện minh cho việc vô hiệu hóa xác minh chứng chỉ hoặc tên máy.
**Q: Liệu một proxy rõ ràng của OkHttp có ghi đè lên ProxySelector không?**
Có. Cài đặt `proxy` rõ ràng của OkHttp có ưu tiên; `proxySelector` chỉ được tham khảo khi proxy rõ ràng là null. Sử dụng `Proxy.NO_PROXY` khi một client phải luôn kết nối trực tiếp.
**Q: Tôi có nên tạo một OkHttpClient mới cho mỗi yêu cầu xoay vòng không?**
Không. Xây dựng một tập hợp khách hàng tái sử dụng có giới hạn—mỗi endpoint hoặc chính sách định tuyến—và chọn trong số đó. Điều này bảo tồn các hồ bơi kết nối và tránh việc tạo lại tài nguyên thực thi nhiều lần.
Marcus Chen
Aug. 20th 2026
110M+ IP that voi ti le truy cap thanh cong 99.9%
Phan hoi trung binh ~0.5s cho tac vu dong thoi cao
Chi tu $0.1/GB
Truy cap ngay cac pool proxy residential, datacenter, IPv6 va ISP cao cap.