rquest-0.25.0 has been yanked.
rquest

An ergonomic, all-in-one JA3/JA4/HTTP2 fingerprint HTTP/WebSocket client.
- Async Client
- Plain, JSON, urlencoded, multipart bodies
- Headers Order
- Customizable redirect policy
- Cookie Store
- HTTP Proxies
HTTPS/WebSocket via BoringSSL
- Preconfigured
TLS/HTTP2/Headers settings
- Changelog
Additional learning resources include:
Usage
This asynchronous example uses Tokio and enables some
optional features, so your Cargo.toml could look like this:
HTTP
[dependencies]
tokio = { version = "1", features = ["full"] }
rquest = "0.25"
use std::error::Error;
use rquest::tls::Impersonate;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let client = rquest::Client::builder()
.impersonate(Impersonate::Chrome129)
.build()?;
let resp = client.get("https://tls.peet.ws/api/all").send().await?;
println!("{}", resp.text().await?);
Ok(())
}
WebSocket
[dependencies]
tokio = { version = "1", features = ["full"] }
rquest = { version = "0.25", features = ["websocket"] }
use futures_util::{SinkExt, StreamExt, TryStreamExt};
use rquest::{tls::Impersonate, Client, Message};
use std::error::Error;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let client = Client::builder()
.impersonate(Impersonate::Chrome129)
.build()?;
let websocket = client.get("wss://echo.websocket.org")
.upgrade()
.send()
.await?
.into_websocket()
.await?;
let (mut tx, mut rx) = websocket.split();
tokio::spawn(async move {
for i in 1..11 {
tx.send(Message::Text(format!("Hello, World! #{i}")))
.await
.unwrap();
}
});
while let Some(message) = rx.try_next().await? {
match message {
Message::Text(text) => println!("received: {text}"),
_ => {}
}
}
Ok(())
}
Preconfigured TLS/HTTP2
[dependencies]
tokio = { version = "1", features = ["full"] }
rquest = "0.25"
use boring::ssl::{SslConnector, SslMethod};
use http::{header, HeaderValue};
use rquest::{
tls::{Http2Settings, ImpersonateSettings, TlsSettings},
HttpVersionPref,
};
use rquest::{PseudoOrder::*, SettingsOrder::*};
use std::error::Error;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let settings = ImpersonateSettings::builder()
.tls(
TlsSettings::builder()
.connector(Box::new(|| SslConnector::builder(SslMethod::tls_client())))
.tls_sni(true)
.http_version_pref(HttpVersionPref::Http2)
.application_settings(true)
.pre_shared_key(true)
.enable_ech_grease(true)
.permute_extensions(true)
.build(),
)
.http2(
Http2Settings::builder()
.initial_stream_window_size(6291456)
.initial_connection_window_size(15728640)
.max_concurrent_streams(1000)
.max_header_list_size(262144)
.header_table_size(65536)
.enable_push(false)
.headers_priority((0, 255, true))
.headers_pseudo_order([Method, Scheme, Authority, Path])
.settings_order(&[
HeaderTableSize,
EnablePush,
MaxConcurrentStreams,
InitialWindowSize,
MaxFrameSize,
MaxHeaderListSize,
EnableConnectProtocol,
])
.build(),
)
.headers(Box::new(|headers| {
headers.insert(header::USER_AGENT, HeaderValue::from_static("rquest"));
}))
.build();
let client = rquest::Client::builder()
.use_preconfigured_tls(settings)
.build()?;
let resp = client.get("https://tls.peet.ws/api/all").send().await?;
println!("{}", resp.text().await?);
Ok(())
}
Device
Currently supported impersonate device types
Chrome100,Chrome101,Chrome104,Chrome105,Chrome106,Chrome107,Chrome108,Chrome109,Chrome114,Chrome116,Chrome117,Chrome118,Chrome119,Chrome120,Chrome123,Chrome124,Chrome126,Chrome127,Chrome128,Chrome129
Edge101,Edge122,Edge127
SafariIos17_2,SafariIos17_4_1,SafariIos16_5,Safari15_3,Safari15_5,Safari15_6_1,Safari16,Safari16_5,Safari17_0,Safari17_2_1,Safari17_4_1,Safari17_5,Safari18,SafariIPad18
OkHttp3_9,OkHttp3_11,OkHttp3_13,OkHttp3_14,OkHttp4_9,OkHttp4_10,OkHttp5
Requirement
Install the environment required to build BoringSSL
Do not compile with crates that depend on OpenSSL; their prefixing symbols are the same and may cause linking failures.
Building
sudo apt-get install build-essential cmake perl pkg-config libclang-dev musl-tools -y
cargo build --release
You can also use this GitHub Actions workflow to compile your project on Linux, Windows, and macOS.
Contributing
If you would like to submit your contribution, please open a Pull Request.
Getting help
Your question might already be answered on the issues
License
Apache-2.0 LICENSE
Accolades
The project is based on a fork of reqwest.