#http-request #指数退避 #中间件 #客户端 #请求-响应 #日志记录 #记录回放

httpclient

带中间件的HTTP客户端。中间件提供对记录/回放、日志记录、指数退避等功能的可组合支持。

66个版本 (21个破坏性版本)

0.23.12 2024年8月4日
0.23.10 2024年7月14日
0.21.3 2024年1月22日
0.20.2 2023年12月25日
0.1.12 2022年3月31日

#43HTTP客户端

Download history 79/week @ 2024-04-27 371/week @ 2024-05-04 128/week @ 2024-05-11 141/week @ 2024-05-18 128/week @ 2024-05-25 383/week @ 2024-06-01 463/week @ 2024-06-08 611/week @ 2024-06-15 567/week @ 2024-06-22 565/week @ 2024-06-29 113/week @ 2024-07-06 418/week @ 2024-07-13 221/week @ 2024-07-20 648/week @ 2024-07-27 339/week @ 2024-08-03 212/week @ 2024-08-10

每月1,476次下载
用于 28 crates

MIT 许可证

90KB
2K SLoC

GitHub Contributors Stars Build Status Downloads Crates.io

HttpClient

httpclient 是Rust中一个用户友好的http客户端。尽可能模仿 reqwest API。为什么要构建一个新的http客户端?

  • httpclient::{Request, Response} 对象是serde序列化的,这启用了记录/回放功能。请参阅下面的示例以了解其实际应用。
  • httpclient 提供了一个用于用户可扩展中间件的API。内置中间件包括重定向、重试、日志记录和记录/回放。
  • httpclient 提供了一个内置的 Error 类型,可以返回Http请求,其中包括状态码、头信息和响应体。
  • httpclient 提供了一些便利的方法,这些方法是 reqwest 所不支持的最重要是 IntoFuture 实现,它等待请求和响应体,从而简化了即使在错误情况下也要返回请求体的场景。

Oauth2

对于Oauth2,请使用 Oauth2Flow 和来自 httpclient_oauth2Oauth2 中间件。

关于Http 1.0的说明

http 最近升级到了1.0。然而, hyper_rustls 仍然依赖于 0.2.x。我们正在等待 hyper_rustls 升级我们的依赖项。

#[tokio::main]
async fn main() {
    let mut client = httpclient::Client::new()
        // With this middleware, the script will only make the request once. After that, it replays from the filesystem
        // and does not hit the remote server. The middleware has different modes to ignore recordings (to force refresh)
        // and to prevent new requests (for running a test suite).
        // The recordings are sanitized to hide secrets.
        .with_middleware(httpclient::middleware::Recorder::new())
        ;
    let res = client.get("https://www.jsonip.com/")
        .header("secret", "foo")
        .await
        .unwrap();
    let res = res.text().unwrap();
    
    let res = client.get("https://www.jsonip.com/")
        .header("secret", "foo")
        .send()
        .await
        .unwrap();
    // By using `send()`, we now can separately await the request body.
    let res = res.text().await.unwrap();
}

路线图

  • 在Recorder中隐藏秘密。请求必须尊重隐藏值进行哈希和Eq检查。
  • 确保在wasm32-unknown-unknown上构建
  • 在json中清理"sessid"

依赖项

~9–22MB
~371K SLoC