3 releases

Uses new Rust 2024

new 0.1.0-alpha3 Mar 12, 2025
0.1.0-alpha2 Feb 17, 2025
0.1.0-alpha Nov 5, 2024

#122 in HTTP client

Download history 3/week @ 2024-11-13 7/week @ 2024-11-20 100/week @ 2025-02-12 41/week @ 2025-02-19 18/week @ 2025-02-26

159 downloads per month
Used in 2 crates

MIT license

73KB
2K SLoC

areq

Async runtime independent HTTP requests

Development

🚧 The library is currently under development 🚧

Many features require an unstable Rust feature – return type notation. The main crate areq has the rtn feature, which enables the missing functionality. High-level crates areq-smol and areq-tokio require this feature for compilation, so to use the library you need to install nightly compiler. Once the RTN feature is stabilized, the library will be usable on stable.

Features

  • Async only, no hidden overhead from blocking API
  • Independent of any async runtime, including features. Instead, the runtime extends the functionality of the base crate
  • Zero-cost abstractions for a flexible solution and an ability to choose a simple API when needed
  • Modular and configurable – build exactly the HTTP client you need

Getting Started

Although the library is runtime-independent, it also provides high-level crates for choosing a specific runtime. Currently, two crates are available:

As an example, let's use tokio and add the crate to a project. You also need to select an HTTP protocol version that the client will support. For this example, let's use HTTP/1.1 which can be enabled with the http1 cargo feature:

cargo add areq-tokio -F http1

Now you can make a GET request and read a response body:

fn main() {
    use {
        areq_tokio::{areq::{http::Uri, http1::Http1}, prelude::*},
        std::io::Error,
    };

    async fn get() -> Result<String, Error> {
        let addr = Uri::from_static("http://127.0.0.1:3001");
        let (mut client, conn) = Http1::default().connect(addr).await?;
        tokio::spawn(conn);

        let path = Uri::from_static("/hello");
        client.get(path).await?.text().await
    }

    let rt = tokio::runtime::Runtime::new();
    match rt.and_then(|rt| rt.block_on(get())) {
        Ok(text) => println!("{text}"),
        Err(e) => eprintln!("io error: {e}"),
    }
}

Dependencies

~3–14MB
~174K SLoC