Rust reqwest proxy: HTTP, HTTPS và SOCKS5 có xác thực
Rust reqwest proxy là cách cấu hình để thư viện reqwest, thư viện gửi yêu cầu HTTP phổ biến nhất của Rust, đi qua máy chủ proxy HTTP, HTTPS hoặc SOCKS5. reqwest có sẵn kiểu Proxy để khai báo proxy cho mọi yêu cầu hoặc riêng theo giao thức, hỗ trợ tài khoản mật khẩu, tự đọc biến môi trường, và cho phép tắt proxy hệ thống khi cần. Bài này ProxyVN hướng dẫn dùng proxy với reqwest từ cơ bản tới nâng cao: Proxy::all, Proxy::http, Proxy::https, basic_auth, bật tính năng socks và phân biệt socks5 với socks5h, tắt proxy hệ thống bằng no_proxy, xoay proxy theo client, xử lý lỗi, kèm ví dụ bất đồng bộ với tokio. Xem thêm dịch vụ tại ProxyVN.
Tổng quan về reqwest và proxy
reqwest là thư viện HTTP mức cao cho Rust, xây trên hyper, mặc định chạy bất đồng bộ trên tokio, có thêm chế độ đồng bộ (blocking). Tài liệu đầy đủ có trên trang tài liệu reqwest.
Proxy được gắn vào Client
Trong reqwest, proxy là thuộc tính của Client, không phải của từng yêu cầu. Khi tạo Client bằng ClientBuilder, khai báo một hoặc nhiều Proxy. Mọi yêu cầu gửi qua Client đó sẽ được xét theo danh sách proxy. Muốn dùng proxy khác, tạo Client khác. Các tuỳ chọn của ClientBuilder có trong tài liệu ClientBuilder.
Kiểu Proxy
Kiểu Proxy có các hàm tạo chính:
- Proxy::all(url): mọi yêu cầu, cả HTTP và HTTPS, đi qua proxy.
- Proxy::http(url): chỉ yêu cầu tới địa chỉ http:// đi qua proxy.
- Proxy::https(url): chỉ yêu cầu tới địa chỉ https:// đi qua proxy.
- Proxy::custom(hàm): tự viết hàm chọn proxy theo địa chỉ đích.
Chi tiết từng hàm có trong tài liệu kiểu Proxy.
Proxy hệ thống mặc định
Nếu không khai báo gì, reqwest mặc định đọc biến môi trường HTTP_PROXY, HTTPS_PROXY, ALL_PROXY và NO_PROXY (cả chữ thường). Đây là điểm hay gây bất ngờ: chương trình chạy trên máy có đặt biến proxy sẽ tự đi qua proxy dù mã không nhắc tới proxy.
Chuẩn bị dự án Rust dùng reqwest với proxy
Khai báo thư viện trong Cargo.toml
[dependencies]
reqwest = { version = "0.12", features = ["json", "socks"] }
tokio = { version = "1", features = ["full"] }
Tính năng socks chỉ cần khi dùng proxy SOCKS5. Nếu cần chế độ đồng bộ, thêm "blocking" vào danh sách features. Thư viện tokio là môi trường chạy bất đồng bộ, thông tin có trên trang chủ tokio.
Thông tin proxy
Proxy gồm giao thức, địa chỉ, cổng, tài khoản, mật khẩu. Proxy mua từ nhà cung cấp thường ở dạng ip:port:user:pass, cần chuyển thành URL dạng http://user:pass@ip:port cho reqwest. Cách đọc các định dạng có trong bài định dạng proxy.
Kiểm tra IP trước và sau
Chuẩn bị một địa chỉ trả về IP của người gọi, ví dụ https://api.ipify.org. Gọi một lần không proxy, một lần có proxy, so sánh để biết proxy có tác dụng.
Proxy HTTP cơ bản với reqwest

reqwest chọn proxy cho từng yêu cầu
Proxy::all cho mọi yêu cầu
use reqwest::{Client, Proxy};
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
let proxy = Proxy::all("http://203.0.113.10:8080")?;
let client = Client::builder().proxy(proxy).build()?;
let ip = client.get("https://api.ipify.org").send().await?.text().await?;
println!("IP qua proxy: {}", ip);
Ok(())
}
Với yêu cầu tới https://, reqwest gửi lệnh CONNECT tới proxy để mở đường hầm, sau đó bắt tay TLS trực tiếp với máy chủ đích qua đường hầm. Proxy không đọc được nội dung. Cơ chế này giải thích trong bài proxy tunnel là gì.
Tách proxy theo giao thức
let client = Client::builder()
.proxy(Proxy::http("http://203.0.113.10:8080")?)
.proxy(Proxy::https("http://203.0.113.11:8080")?)
.build()?;
Yêu cầu http:// đi qua proxy thứ nhất, https:// đi qua proxy thứ hai. Thực tế ít khi cần tách, nhưng hữu ích khi mạng công ty có proxy riêng cho từng loại.
Proxy có kết nối TLS tới proxy
Nếu nhà cung cấp cho proxy dạng HTTPS (kết nối từ máy tới proxy được mã hoá), dùng URL bắt đầu bằng https://. reqwest sẽ bắt tay TLS với proxy trước, rồi mới gửi CONNECT. Phân biệt với trường hợp thường gặp hơn: proxy HTTP thường, nhưng đích là trang HTTPS.
Proxy có xác thực trong reqwest

Proxy có xác thực trong reqwest
Tài khoản trong URL
let proxy = Proxy::all("http://user123:pass456@203.0.113.10:8080")?;
reqwest đọc tài khoản trong URL và tự gửi tiêu đề Proxy-Authorization. Nếu mật khẩu có ký tự đặc biệt như @, :, /, #, cần mã hoá phần trăm, ví dụ @ thành %40.
Dùng basic_auth
let proxy = Proxy::all("http://203.0.113.10:8080")?
.basic_auth("user123", "pass456");
Cách này tránh phải mã hoá ký tự đặc biệt trong mật khẩu, và tách thông tin bí mật khỏi URL. Nên đọc tài khoản từ biến môi trường hoặc tệp cấu hình, không viết thẳng vào mã nguồn.
Lỗi 407
Khi sai tài khoản, proxy trả về mã 407. Với yêu cầu https:// qua CONNECT, reqwest thường báo lỗi kết nối thay vì trả về phản hồi có mã 407, vì đường hầm không mở được. Kiểm tra lại tài khoản, mã hoá ký tự đặc biệt. Ý nghĩa mã 407 có trong bài sửa lỗi 407 Proxy Authentication Required.
Xác thực theo IP
Nhiều nhà cung cấp cho khai báo IP của máy chủ chạy chương trình, khỏi cần tài khoản. Khi đó URL proxy không có phần user:pass. Cách này hợp với máy chủ có IP cố định.
Proxy SOCKS5 với reqwest
Bật tính năng socks
Như phần chuẩn bị, thêm "socks" vào features của reqwest. Không bật mà dùng URL socks5:// sẽ gặp lỗi khi tạo Proxy hoặc khi gửi yêu cầu.
socks5 và socks5h

socks5 và socks5h khác nhau ở DNS
// Máy tự phân giải tên miền, gửi IP cho proxy
let p1 = Proxy::all("socks5://user123:pass456@203.0.113.10:1080")?;
// Gửi tên miền cho proxy phân giải
let p2 = Proxy::all("socks5h://user123:pass456@203.0.113.10:1080")?;
Với socks5://, máy chạy chương trình tự hỏi DNS rồi gửi địa chỉ IP cho proxy. Truy vấn DNS lộ ra mạng cục bộ, và kết quả DNS có thể khác kết quả ở vị trí proxy. Với socks5h://, tên miền được gửi cho proxy, proxy phân giải. Khi cần IP và vị trí nhất quán, dùng socks5h. Khác biệt giữa HTTP và SOCKS5 nói chung có trong bài proxy HTTP và SOCKS5.
Khi nào chọn SOCKS5 thay HTTP
- Nhà cung cấp chỉ cho SOCKS5.
- Cần đi qua proxy cho cả giao thức không phải HTTP trong cùng chương trình (khi đó dùng thư viện khác cho phần không phải HTTP).
- Proxy HTTP của nhà cung cấp chèn thêm tiêu đề không mong muốn.
Với yêu cầu HTTP thông thường, proxy HTTP và SOCKS5 cho kết quả tương đương.
Tắt proxy hệ thống và NO_PROXY
Tắt mọi proxy
let client = Client::builder().no_proxy().build()?;
no_proxy() trên ClientBuilder tắt cả proxy hệ thống từ biến môi trường. Dùng khi chương trình gọi dịch vụ nội bộ và không được đi qua proxy dù máy có đặt biến môi trường.
Loại trừ một số địa chỉ
use reqwest::NoProxy;
let proxy = Proxy::all("http://203.0.113.10:8080")?
.no_proxy(NoProxy::from_string("localhost,127.0.0.1,.noi-bo.local"));
Các địa chỉ trong danh sách đi thẳng, các địa chỉ khác đi qua proxy. Có thể dùng NoProxy::from_env() để đọc từ biến NO_PROXY. Cách viết danh sách loại trừ giải thích trong bài no_proxy là gì.
Dùng biến môi trường thay cho mã
export HTTPS_PROXY="http://user123:pass456@203.0.113.10:8080"
export NO_PROXY="localhost,127.0.0.1"
cargo run
Ưu điểm: không phải sửa mã khi đổi proxy, tiện khi chạy trong Docker hay CI. Nhược điểm: khó kiểm soát khi môi trường có sẵn biến proxy mà mình không biết. Cấu hình proxy trong container có bài proxy Docker.
Chọn proxy theo địa chỉ đích với Proxy::custom
Ví dụ chọn proxy theo tên miền
use reqwest::{Proxy, Url};
let proxy = Proxy::custom(|url: &Url| {
match url.host_str() {
Some(h) if h.ends_with(".vn") => "http://203.0.113.10:8080".parse().ok(),
_ => None,
}
});
Hàm nhận địa chỉ đích, trả về Some(địa chỉ proxy) để đi qua proxy, None để đi thẳng. Hữu ích khi chỉ một số trang cần IP Việt Nam, còn lại đi thẳng cho nhanh.
Lưu ý về hiệu năng
Hàm custom được gọi cho mỗi yêu cầu, nên giữ nó đơn giản, không gọi mạng hay đọc tệp trong hàm.
Xoay proxy với reqwest
Khi thu thập dữ liệu số lượng lớn, cần chia yêu cầu qua nhiều proxy để không dồn tải lên một IP.

Xoay proxy với nhiều client
Mỗi proxy một Client
Vì proxy gắn với Client, cách rõ ràng nhất là tạo danh sách Client, mỗi Client một proxy, rồi chia yêu cầu lần lượt:
use reqwest::{Client, Proxy};
use std::sync::atomic::{AtomicUsize, Ordering};
struct Pool { clients: Vec<Client>, next: AtomicUsize }
impl Pool {
fn new(proxies: &[&str]) -> reqwest::Result<Self> {
let clients = proxies.iter()
.map(|p| Client::builder().proxy(Proxy::all(*p)?).build())
.collect::<reqwest::Result<Vec<_>>>()?;
Ok(Pool { clients, next: AtomicUsize::new(0) })
}
fn get(&self) -> &Client {
let i = self.next.fetch_add(1, Ordering::Relaxed) % self.clients.len();
&self.clients[i]
}
}
Mỗi Client giữ bể kết nối riêng, nên kết nối tới cùng một máy chủ qua cùng một proxy được tái sử dụng, nhanh hơn tạo mới mỗi lần.
Dùng proxy xoay của nhà cung cấp
Cách đơn giản hơn: dùng một cổng proxy xoay, nhà cung cấp tự đổi IP theo thời gian hoặc theo lượt. Chương trình chỉ cần một Client. Lưu ý bể kết nối của reqwest giữ kết nối mở, nên nhiều yêu cầu liên tiếp có thể đi qua cùng một kết nối, tức cùng một IP. Nếu cần đổi IP mỗi yêu cầu, giảm thời gian giữ kết nối nhàn rỗi:
let client = Client::builder()
.proxy(Proxy::all("http://user:pass@gw.example.net:8000")?)
.pool_max_idle_per_host(0)
.build()?;
Giới hạn đồng thời
Gửi quá nhiều yêu cầu cùng lúc qua một proxy làm proxy quá tải và trang đích chặn. Dùng Semaphore của tokio để giới hạn số yêu cầu đồng thời trên mỗi proxy.
Xử lý lỗi khi dùng proxy với reqwest
Phân loại lỗi
reqwest::Error có các hàm kiểm tra loại lỗi:
- is_connect(): không kết nối được, thường do proxy chết, sai địa chỉ, sai cổng, hoặc đường hầm CONNECT bị từ chối.
- is_timeout(): quá thời gian chờ.
- is_status(): máy chủ trả về mã lỗi, khi gọi error_for_status().
- is_request(), is_body(), is_decode(): lỗi trong quá trình gửi, đọc nội dung.
Đặt thời gian chờ
use std::time::Duration;
let client = Client::builder()
.proxy(Proxy::all("http://203.0.113.10:8080")?)
.connect_timeout(Duration::from_secs(10))
.timeout(Duration::from_secs(30))
.build()?;
Không đặt thời gian chờ, một proxy treo có thể giữ tác vụ rất lâu. connect_timeout áp dụng cho bước kết nối, timeout áp dụng cho cả yêu cầu.
Thử lại có kiểm soát
Với lỗi kết nối và hết thời gian chờ, thử lại một hai lần, chuyển sang proxy khác trong bể. Với mã 403, 429 từ trang đích, giảm tốc độ, chờ lâu hơn, không thử lại ngay. Mã 429 và cách xử lý giới hạn tốc độ có trong bài proxy bị lỗi 429.
Bảng lỗi thường gặp
Hiện tượng |
Nguyên nhân hay gặp |
Cách xử lý |
|---|---|---|
Lỗi khi tạo Proxy với socks5:// |
Chưa bật tính năng socks |
Thêm "socks" vào features |
is_connect khi gọi https |
Sai tài khoản, proxy chặn CONNECT |
Kiểm tra tài khoản, cổng |
Chương trình đi qua proxy dù không khai báo |
Biến môi trường HTTP_PROXY |
Dùng no_proxy() hoặc xoá biến |
IP không đổi khi dùng proxy xoay |
Kết nối được tái sử dụng |
pool_max_idle_per_host(0) |
DNS lộ ra mạng cục bộ |
Dùng socks5:// |
Đổi sang socks5h:// |
Lỗi chứng chỉ khi dùng proxy công ty |
Proxy giải mã HTTPS |
Thêm chứng chỉ gốc của công ty |
Treo lâu |
Không đặt thời gian chờ |
connect_timeout, timeout |
Chế độ đồng bộ (blocking)
Với công cụ dòng lệnh đơn giản không cần bất đồng bộ, bật tính năng blocking và dùng reqwest::blocking::Client. Cách khai báo proxy giống hệt.
use reqwest::blocking::Client;
use reqwest::Proxy;
fn main() -> Result<(), reqwest::Error> {
let client = Client::builder()
.proxy(Proxy::all("socks5h://user123:pass456@203.0.113.10:1080")?)
.build()?;
println!("{}", client.get("https://api.ipify.org").send()?.text()?);
Ok(())
}
Không gọi blocking::Client bên trong hàm async của tokio, vì nó tự tạo môi trường chạy riêng và có thể gây lỗi.
Proxy công ty chặn và giải mã HTTPS
Một số mạng doanh nghiệp dùng proxy kiểm tra nội dung, giải mã HTTPS bằng chứng chỉ gốc của công ty. Trình duyệt chạy bình thường vì máy đã cài chứng chỉ gốc, nhưng chương trình Rust báo lỗi chứng chỉ.
Thêm chứng chỉ gốc
let pem = std::fs::read("cong-ty-root.pem")?;
let cert = reqwest::Certificate::from_pem(&pem)?;
let client = Client::builder()
.proxy(Proxy::all("http://proxy.cong-ty.local:3128")?)
.add_root_certificate(cert)
.build()?;
Không dùng danger_accept_invalid_certs(true) để vượt lỗi, vì tắt mọi kiểm tra chứng chỉ, mở đường cho tấn công xen giữa.
Quản lý cấu hình proxy trong ứng dụng Rust
Viết thẳng địa chỉ proxy vào mã chỉ hợp với ví dụ. Ứng dụng thật cần đổi proxy mà không phải biên dịch lại, và không để lộ tài khoản.
Đọc từ biến môi trường riêng
Đặt tên biến riêng cho ứng dụng, ví dụ APP_PROXY_URL, APP_PROXY_USER, APP_PROXY_PASS, thay vì dùng HTTP_PROXY chung. Như vậy ứng dụng chỉ dùng proxy khi mình chủ động cấu hình, không bị ảnh hưởng bởi biến proxy của hệ thống. Kết hợp với no_proxy() trên ClientBuilder để chắc rằng chỉ proxy mình khai báo được dùng.
Đọc từ tệp cấu hình
Với danh sách nhiều proxy, đọc từ tệp TOML hoặc JSON bằng thư viện serde. Mỗi mục gồm địa chỉ, giao thức, tài khoản, nhãn (nhà mạng, tỉnh). Tệp cấu hình chứa mật khẩu không đưa lên kho mã, thêm vào .gitignore, chỉ giữ một tệp mẫu không có mật khẩu.
Kiểm tra cấu hình khi khởi động
Khi ứng dụng khởi động, tạo Client cho từng proxy và gọi thử một địa chỉ kiểm tra IP. Proxy nào lỗi thì ghi nhật ký và loại khỏi bể ngay từ đầu, thay vì để lỗi xuất hiện giữa lúc chạy. Bước này tốn vài giây nhưng tiết kiệm nhiều thời gian gỡ lỗi.
Không ghi mật khẩu vào nhật ký
Khi in thông tin proxy ra nhật ký, che phần tài khoản. Một lỗi hay gặp là in nguyên URL proxy có user:pass khi báo lỗi kết nối. Viết hàm hiển thị riêng chỉ in địa chỉ và cổng.
Gỡ lỗi kết nối proxy trong reqwest
Bật nhật ký chi tiết
reqwest và hyper ghi nhật ký qua hệ thống log của Rust. Dùng thư viện env_logger hoặc tracing-subscriber, chạy chương trình với biến RUST_LOG=reqwest=debug,hyper=debug để thấy các bước kết nối: chọn proxy, mở kết nối, gửi CONNECT, bắt tay TLS. Nhật ký giúp biết lỗi xảy ra ở bước nào.
So sánh với curl
Khi chương trình lỗi, thử cùng proxy bằng curl trên cùng máy. curl chạy được mà chương trình không, lỗi nằm ở mã hoặc cấu hình reqwest. curl cũng lỗi, vấn đề nằm ở proxy hoặc mạng. Cách dùng curl với proxy có trong bài curl proxy là gì.
Kiểm tra từng thành phần
Tách vấn đề theo thứ tự: máy có ra Internet không, có kết nối được tới địa chỉ và cổng của proxy không, tài khoản có đúng không, đích có chặn IP của proxy không. Mỗi bước loại trừ một nhóm nguyên nhân. Lỗi kết nối tới proxy hay gặp và cách đọc có trong bài máy chủ proxy từ chối kết nối.
Dùng proxy gỡ lỗi để xem yêu cầu
Đặt một proxy gỡ lỗi như mitmproxy trên máy, cho reqwest đi qua nó, thêm chứng chỉ của mitmproxy bằng add_root_certificate. Toàn bộ yêu cầu và phản hồi hiện ra để kiểm tra tiêu đề, cookie, nội dung. Chỉ làm trên máy phát triển, không làm trên máy chủ thật. Cách dùng có trong bài mitmproxy.
Thu thập dữ liệu có trách nhiệm với reqwest và proxy
Proxy giúp chia tải và tránh bị chặn theo IP, nhưng không thay được cách thu thập đúng mực.
Tôn trọng tốc độ của trang đích
Đặt khoảng nghỉ giữa các yêu cầu tới cùng một trang, giới hạn số yêu cầu đồng thời. Rust chạy rất nhanh, một vòng lặp không giới hạn có thể gửi hàng trăm yêu cầu mỗi giây, đủ làm chậm một trang nhỏ.
Gửi tiêu đề hợp lý
Đặt User-Agent rõ ràng bằng hàm user_agent trên ClientBuilder. Một số trang chặn yêu cầu không có User-Agent. Không giả mạo danh tính của công cụ tìm kiếm.
Chỉ thu thập dữ liệu công khai
Không đăng nhập bằng tài khoản người khác, không vượt qua cơ chế đăng nhập, không thu thập dữ liệu cá nhân trái phép. Đọc điều khoản sử dụng và tệp robots.txt của trang. Khái niệm và cách làm đúng có trong bài web scraping proxy là gì.
Lưu đệm kết quả
Lưu kết quả đã tải để không tải lại cùng một trang nhiều lần. Ít yêu cầu hơn nghĩa là ít tốn proxy hơn và ít bị chặn hơn.
Đo chất lượng proxy bằng reqwest
Trước khi đưa một danh sách proxy vào chạy thật, nên đo nhanh từng proxy. Viết một chương trình nhỏ bằng reqwest là cách tiện vì dùng đúng thư viện của ứng dụng chính.
Những chỉ số nên đo
- Thời gian kết nối: từ lúc gửi tới lúc có phản hồi đầu tiên, phản ánh độ trễ của proxy.
- Tỷ lệ thành công: gửi khoảng hai chục yêu cầu, đếm số yêu cầu thành công.
- IP thoát ra: gọi địa chỉ kiểm tra IP, đối chiếu với IP nhà cung cấp cam kết.
- Vị trí: tra IP thoát ra trên dịch vụ định vị IP, xem có đúng quốc gia, tỉnh không.
Cách đo
Dùng std::time::Instant ghi thời điểm trước khi gửi và sau khi nhận phản hồi. Chạy song song cho nhiều proxy bằng tokio, mỗi proxy một tác vụ, mỗi tác vụ có thời gian chờ riêng. Ghi kết quả ra tệp CSV để so sánh giữa các lần đo. Các công cụ đo có sẵn, không cần viết mã, được tổng hợp trong bài công cụ kiểm tra proxy.
Đọc kết quả
Proxy có độ trễ cao bất thường hoặc tỷ lệ lỗi trên một phần mười nên loại khỏi bể. Proxy có IP thoát ra khác IP cam kết, hoặc vị trí sai, cần báo nhà cung cấp. Đo lại định kỳ, vì chất lượng proxy thay đổi theo giờ cao điểm.
Triển khai chương trình Rust dùng proxy lên máy chủ
Chạy như dịch vụ hệ thống
Trên Linux, chương trình chạy nền thường được quản lý bằng systemd. Biến môi trường proxy khai báo trong tệp dịch vụ bằng dòng Environment, hoặc trỏ tới tệp chứa biến bằng EnvironmentFile. Tệp chứa mật khẩu đặt quyền đọc chỉ cho tài khoản chạy dịch vụ.
Chạy trong container
Biên dịch chương trình thành tệp nhị phân, đóng gói vào ảnh container nhỏ. Truyền thông tin proxy qua biến môi trường lúc chạy container, không đưa vào ảnh. Nếu ảnh dùng thư viện TLS của hệ thống, nhớ cài gói chứng chỉ gốc trong ảnh, nếu không mọi yêu cầu HTTPS đều lỗi chứng chỉ, dễ nhầm là lỗi proxy.
Xác thực theo IP của máy chủ
Máy chủ có IP cố định nên dùng xác thực theo IP với nhà cung cấp proxy. Khi đó URL proxy không cần mật khẩu, giảm rủi ro lộ thông tin trong cấu hình. Khi đổi máy chủ, nhớ cập nhật IP mới với nhà cung cấp.
Theo dõi khi chạy lâu dài
Chương trình chạy liên tục nên ghi lại số yêu cầu thành công, số lỗi theo từng proxy, thời gian phản hồi trung bình. Khi tỷ lệ lỗi của một proxy tăng đột ngột, tự động tạm loại proxy đó khỏi bể và gửi cảnh báo. Cách này giúp phát hiện proxy hết hạn hoặc bị chặn trước khi ảnh hưởng tới toàn bộ dữ liệu thu thập.
So sánh với proxy trong các ngôn ngữ khác
Ngôn ngữ, thư viện |
Khai báo proxy |
SOCKS5 |
Đọc biến môi trường mặc định |
|---|---|---|---|
Rust reqwest |
Proxy trên ClientBuilder |
Có, tính năng socks |
Có |
Go net/http |
Transport.Proxy |
Qua gói x/net/proxy |
Có, ProxyFromEnvironment |
Python requests |
Tham số proxies |
Có, cần PySocks |
Có |
Python aiohttp |
Tham số proxy mỗi yêu cầu |
Qua thư viện phụ |
Khi bật trust_env |
Node.js axios |
Tuỳ chọn proxy hoặc agent |
Qua agent |
Có |
Hướng dẫn chi tiết cho từng ngôn ngữ: Golang proxy, Java proxy, aiohttp proxy, Axios proxy.
Chọn proxy cho chương trình Rust
Theo mục đích
- Gọi API với tài khoản: proxy tĩnh, IP cố định, để API không nghi ngờ.
- Thu thập dữ liệu công khai số lượng lớn: proxy xoay hoặc bể nhiều proxy tĩnh.
- Kiểm tra hiển thị theo vùng: proxy đúng quốc gia, đúng tỉnh.
Giao thức
Nếu nhà cung cấp hỗ trợ cả hai, HTTP dùng ngay không cần bật thêm tính năng. SOCKS5 với socks5h khi cần phân giải tên miền ở phía proxy.
Vị trí
Chương trình chạy trên máy chủ ở Việt Nam gọi trang Việt Nam thì proxy Việt Nam cho độ trễ thấp nhất. Anh em cần proxy HTTP, SOCKS5 IP Việt Nam ổn định theo nhà mạng Viettel, VNPT, FPT cho chương trình Rust có thể mua proxy tại ProxyVN.
Câu hỏi thường gặp về Rust reqwest proxy
reqwest có đặt proxy cho từng yêu cầu được không
Không trực tiếp. Proxy gắn với Client. Muốn mỗi yêu cầu một proxy, dùng nhiều Client hoặc Proxy::custom chọn theo địa chỉ đích.
Vì sao chương trình vẫn đi qua proxy dù đã xoá dòng khai báo
Vì reqwest đọc biến môi trường HTTP_PROXY, HTTPS_PROXY, ALL_PROXY mặc định. Kiểm tra biến môi trường hoặc gọi no_proxy() trên ClientBuilder.
reqwest có hỗ trợ SOCKS4 không
Tính năng socks hỗ trợ SOCKS5 và có hỗ trợ SOCKS4 ở các bản gần đây qua scheme socks4. SOCKS4 không có xác thực mật khẩu, ít dùng.
Có cần tạo Client mới cho mỗi yêu cầu không
Không nên. Tạo Client tốn tài nguyên và mất lợi ích của bể kết nối. Tạo một lần, dùng lại nhiều lần, chia sẻ qua Arc nếu dùng nhiều tác vụ.
Proxy miễn phí dùng với reqwest được không
Về kỹ thuật được, nhưng proxy miễn phí chậm, hay chết, có thể sửa nội dung trả về với trang HTTP. Không dùng cho dữ liệu hay tài khoản quan trọng.
Tổng kết
Rust reqwest proxy khai báo qua kiểu Proxy trên ClientBuilder: Proxy::all cho mọi yêu cầu, Proxy::http và Proxy::https theo giao thức, Proxy::custom theo địa chỉ đích, basic_auth hoặc tài khoản trong URL cho proxy có xác thực. Bật tính năng socks để dùng SOCKS5, chọn socks5h khi cần proxy phân giải tên miền. Nhớ rằng reqwest đọc biến môi trường proxy mặc định, dùng no_proxy() khi không muốn. Để xoay proxy, dùng nhiều Client hoặc proxy xoay kèm giảm giữ kết nối, luôn đặt thời gian chờ và thử lại có kiểm soát. Cần proxy Việt Nam ổn định cho dự án Rust, anh em liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam để được tư vấn.