#async-http #http-request #http #client #async #request

alhc

异步轻量级HTTP客户端:一个异步HTTP客户端库,如果可能,使用系统库来减小二进制文件大小。(目前处于快速开发中)

10个版本

0.3.0-alpha.42024年4月13日
0.3.0-alpha.32024年4月12日
0.2.2 2023年10月10日
0.2.1 2023年5月8日
0.1.0 2022年11月21日

#134 in HTTP客户端

Download history 20/week @ 2024-04-16 5/week @ 2024-05-21 3/week @ 2024-06-11

每月420次下载

MIT许可证

60KB
1K SLoC

异步轻量级HTTP客户端(简称ALHC)

警告

这个库仍在开发中,且**非常不稳定**,请勿在生产环境中使用。

github.com crates.io docs.rs

如果我们需要一个异步且轻量级的HTTP客户端,而不想使用像reqwestisahcsurf这样的大型库,怎么办?

ALHC是一个异步HTTP客户端库,使用系统库来减小二进制文件大小并提供异步请求功能。

HTTPS示例

use alhc::prelude::*;
use alhc::*;

use pollster::FutureExt;

fn main() -> DynResult {
    let client = get_client_builder().build().unwrap();

    let r = client
        .post("https://httpbin.org/anything")?
        .header("user-agent", "alhc/0.2.0")
        .body_string("Hello World!".repeat(20))
        .block_on()?
        .recv_string()
        .block_on()?;

    println!("{r}");

    Ok(())
}

我们的简单请求示例 https在发布构建中可以小至182 KB,这比tinygethttp示例要小。如果我们使用rustc夜间功能加上build-stdpanic_immediate_abort,它将不可思议地小至65 KB!

目前正在进行中,支持Windows(使用WinHTTP)和类Unix系统(包括macOS)(使用通过isahc crate包装的系统libcurl)。将替换为更简单的curl crate绑定)。

平台状态

名称 状态 注意
Windows 工作 可能不稳定(待优化)
macOS 工作 isahc crate的简单包装
Linux 工作 isahc crate的简单包装

功能

  • async_t_boxed:使用async-trait代替async-t,这需要1.75+版本的rustc,但无成本。默认是禁用的。
  • serde:可以提供发送/接收JSON数据的能力,而无需手动调用serde_json。默认是禁用的。
  • anyhow:请使用 Result 类型,来自 anyhow crate,而不是 Result<T, Box<dyn std::error::Error>>。默认为禁用。

Unix-like平台上的最小二进制大小指南

对于几乎在所有桌面版本上都内置了libcurl的Unix-like系统,如Linux或macOS,您必须安装所有curl crate需要的开发包,以动态链接这些库。例如,在Ubuntu上,您需要安装 libcurl4-openssl-devzlib1g-dev 以实现动态链接。否则,curl crate将从源代码构建并静态链接它们,这将对二进制大小产生严重影响。

编译二进制大小比较

注意:大小优化参数是:cargo +nightly run --release -Z build-std=core,alloc,std,panic_abort -Z build-std-features=panic_immediate_abort --target [TARGET] --example [EXAMPLE]Cargo.toml 中的某些配置

名称 Windows (x86_64) Windows (i686) Windows (aarch64) macOS (x86_64) macOS (aarch64) Linux (x86_64)
示例 https 468,992 402,944 296,960 4,078,936 4,395,400 18,051,064
示例 https 发布版本 181,248 162,816 200,192 729,304 719,192 850,704
示例 https 发布版本(大小优化) 75,264 66,048 59,392 444,680 453,064 465,480
示例 parallel 571,904 486,912 393,216 4,250,296 4,572,120 19,612,824
示例 parallel 发布版本 190,464 170,496 229,888 737,536 735,752 862,992
示例 parallel 发布版本(大小优化) 80,896 71,680 66,560 452,912 453,112 469,576
示例 sequential 472,064 405,504 302,080 4,069,368 4,373,352 18,048,624
示例 sequential 发布版本 182,784 164,864 203,264 729,296 719,176 850,704
示例 sequential 发布版本(大小优化) 76,800 68,096 60,928 448,776 453,064 465,480

依赖项

~11–21MB
~341K SLoC