#http-request #request #http #client

ergoreq

A human-centric web request client developed based on Reqwest, supporting automatic cookie management, automatic retries, and custom middleware

4 releases

0.2.1 Dec 28, 2024
0.2.0 Jun 14, 2024
0.1.1 Oct 29, 2023
0.1.0 Oct 28, 2023

#141 in HTTP client

Download history 5/week @ 2024-09-24 5/week @ 2024-12-10 126/week @ 2024-12-24 4/week @ 2024-12-31 4/week @ 2025-01-07

134 downloads per month

MIT license

66KB
1.5K SLoC

ergoreq

A human-centric web request client developed based on Reqwest.

  • Friendly Url building
  • Automatically retry support
  • Middleware support
  • Automatically manage cookies per-request (instead of per-client)
  • Automatically redirect management per-request
  • Supports all features of reqwest
  • tracing support
  • Well tested

Example

    use ergoreq::{ErgoClient, ErgoCookieContainer, StringUrlBuilderTrait, ErgoStringToRequestExt};
use reqwest::redirect::Policy;
use std::sync::Arc;
use std::time::Duration;

#[tokio::main]
async fn main() {
    // Create a reqwest client first
    let client = reqwest::Client::builder()
        .timeout(Duration::from_secs(30))
        .user_agent("ergoreq/1.0")
        .redirect(Policy::none()) // remember to disable the redirect!
        .build()
        .unwrap();

    // Then create the ergo client
    let client = ErgoClient::new(client).with_auto_redirect_count(5); // global auto redirect count

    // Creates cookie store. You can impl a `CookieContainer` by your own.
    let cookie_store = Arc::new(ErgoCookieContainer::new_secure());

    // Each request will automatically set and store cookie.
    // You can build url by string directly
    "https://httpbin.org"
        .add_url_segment("cookies")
        .add_url_segment("set")
        .add_url_segment("test_cookie")
        .add_url_segment("test_success")
        .http_get(&client)
        .with_cookie_store_ref(&cookie_store)
        .send()
        .await
        .unwrap();

    // Or with batch url building
    "https://httpbin.org"
        .add_url_segments(&["cookies", "set", "test_cookie_1", "test_success_1"])
        .http_get(&client)
        .with_cookie_store_ref(&cookie_store)
        .send()
        .await
        .unwrap();

    // Traditional way to build url
    client
        .get("https://httpbin.org/cookies/set/test_cookie_1/test_success_1")
        .with_cookie_store_ref(&cookie_store)
        .send()
        .await
        .unwrap();

    println!("Cookies: {:#?}", cookie_store.serialize_cookies());

    let response = client
        .get("https://httpbin.org/redirect/4") // last time it will redirect to /get, so 4 represents 5 redirect times
        .send()
        .await
        .unwrap();

    println!(
        "Redirect {}",
        if response.status().is_success() {
            "success"
        } else {
            "fail"
        }
    )
}

More examples can be found in examples directory.

Requirement

The tested reqwest version is 0.12. Using reqwest older than 0.12 may cause compile error.

License

MIT

Thanks to

Dependencies

~8–20MB
~273K SLoC