首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Rust中使用hyper、tokio和futures设置HTTP请求的超时时间?

在Rust中使用hyper、tokio和futures设置HTTP请求的超时时间,可以通过以下步骤实现:

  1. 首先,确保在Cargo.toml文件中添加了hyper、tokio和futures的依赖项。可以使用以下代码添加依赖项:
代码语言:txt
复制
[dependencies]
hyper = "0.14"
tokio = { version = "1", features = ["full"] }
futures = "0.3"
  1. 在Rust代码中导入所需的库和模块:
代码语言:txt
复制
use hyper::{Body, Client, Request};
use hyper::client::HttpConnector;
use hyper::header::HeaderValue;
use hyper::http::uri::Uri;
use hyper::http::response::Parts;
use hyper::http::StatusCode;
use hyper::service::{make_service_fn, service_fn};
use std::convert::Infallible;
use std::net::SocketAddr;
use std::time::Duration;
use tokio::time::timeout;
  1. 创建一个函数来发送HTTP请求并设置超时时间:
代码语言:txt
复制
async fn send_request_with_timeout(uri: Uri) -> Result<Parts, Box<dyn std::error::Error + Send + Sync>> {
    let client = Client::new();
    let req = Request::builder()
        .uri(uri)
        .header("User-Agent", HeaderValue::from_static("Rust Hyper Client"))
        .body(Body::empty())?;

    let addr: SocketAddr = "127.0.0.1:8080".parse().unwrap(); // 替换为实际的服务器地址

    let make_service = make_service_fn(move |_| {
        let client = client.clone();
        async move {
            Ok::<_, Infallible>(service_fn(move |req| {
                let client = client.clone();
                async move {
                    let res = client.request(req).await?;
                    Ok::<_, Infallible>(res)
                }
            }))
        }
    });

    let timeout_duration = Duration::from_secs(5); // 设置超时时间为5秒
    let response = timeout(timeout_duration, async {
        let conn = HttpConnector::new();
        let service = make_service;
        let res = hyper::Server::bind(&addr).serve(service).await?;
        Ok::<_, Infallible>(res)
    })
    .await?;

    let (parts, _) = response.into_parts();
    Ok(parts)
}
  1. 在主函数中调用send_request_with_timeout函数并处理结果:
代码语言:txt
复制
#[tokio::main]
async fn main() {
    let uri: Uri = "http://example.com".parse().unwrap(); // 替换为实际的请求URL
    match send_request_with_timeout(uri).await {
        Ok(parts) => {
            if parts.status == StatusCode::OK {
                println!("Request succeeded!");
            } else {
                println!("Request failed with status code: {}", parts.status);
            }
        }
        Err(err) => {
            println!("Request failed with error: {}", err);
        }
    }
}

这样,你就可以在Rust中使用hyper、tokio和futures设置HTTP请求的超时时间了。请注意,上述代码仅为示例,实际使用时需要根据具体情况进行适当修改。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Rust每周一库】hyper - 底层http

hyper是一个偏底层http库,支持HTTP/1HTTP/2,支持异步Rust,并且同时提供了服务端客户端API支持。...(关于Rust各种网络开发框架,这里有个很全面的综述比较。)所以如果在使用这些框架时候遇到了一些问题,对hyper了解肯定是有一定帮助。...再者学习Rust我们都是奔着成为大佬路线去,很难说不会有直接操作偏底层框架需求。 Hello World 我们首先来实现一个简单服务器端客户端,支持最简单GET操作。...更真实例子 下面我们通过实现一个echo服务主要看一下服务器端如何进行路由,以及如何支持POST请求 服务器端 依赖 [dependencies] hyper = "0.13" tokio = {...我们这里代码以向/echo/reverse提交内容为echoPOST请求为例: use hyper::Client; use hyper::{Body, Method, Request}; #[tokio

2.9K21
  • Rust学习笔记Day24 常用库及生态领域

    clap 以及其他 用于处理异步 futures async-trait 用于提供并发相关数据结构算法 crossbeam 以及用于撰写解析器 nom 及其他 serde 只需要在数据结构上使用...tokioRust 地位,相当于 Golang 处理并发运行时,只不过 Golang 开发者没法选择用不用运行时, 而 Rust 开发者可以不用任何运行时,或者在需要时候有选择地引入 tokio...然而,futures还有很多其它重要 trait 和数据结构,比如我们之前使用 Stream / Sink。...Web开发 从 Web 协议支持角度看: hyper 处理 http1/http2, quinn / quiche 处理 QUIC/http3, tonic 处理 gRPC, tungstenite...,再加上 Rust 本身极其克制内存使用,性能内存使用能甩 electron 好几个身位。

    1.7K31

    Linkerd最先进Rust代理|Linkerd2-proxy

    在垃圾收集运行时中,GC必须偶尔遍历内存对象图,以找到不再使用且可以回收对象。这个过程需要时间,而且可能在不可预测点发生。如果请求是在垃圾收集器通过期间传入,那么它可能具有显著延迟。...很简单:绝大多数可利用安全漏洞——ChromiumWindows70%严重安全漏洞,以及最近内存中一些最严重安全漏洞,heartbleed——都是由缓冲区溢出释放后使用等内存安全漏洞造成...今天,Linkerd2-proxy是建立在一些基础Rust网络库上TokioRust异步运行时 Hyper:快速、安全、正确HTTP实现 Rustls:安全现代TLS实现 Tower:模块化可组合网络软件组件库...HyperRust领先异步HTTP实现,以其最佳类内性能正确性而著称。Tokio一样,Hyper因大规模使用而久经沙场。...Linkerd根据目标权限(target authority)来路由HTTP流量,目标权限是HTTP/1.11.0请求Host: header或请求URL权限部分值,或者HTTP/2:authority

    2K10

    2023 年值得关注 6 个 Rust web开发框架

    Hyper Hyper 仍在开发,可能会在 2023 年稳定发布。但是 Hyper 看起来像是一个有前途框架,可以在 2023 年探索,然后再决定在 Rust 构建一个 Web 应用程序。...Tide 正在积极开发,并拥有广泛社区资源,可让您快速启动运行 Tide 框架具有以下功能,可帮助快速构建应用程序 异步/等待支持 类型安全路由 请求守卫 模板支持 会话管理 网络套接字支持 让我们看一下使用... Brotli 压缩 服务器发送事件 (SSE) 由于它建立在 hyper Tokio - 一个异步 Rust 运行时之上,因此您可以自动获得: HTTP/1 HTTP/2 支持 异步功能...最快 HTTP 实现之一 经过测试正确 下面是一个使用 Warp 简单 Hello, world 示例: //main.rs use warp::Filter; #[tokio::main] async...要使用 Axum,您需要 Rust 版本 v1.6 或更高版本 Axum 功能包括: 使用无宏 API 将请求路由到处理程序。 使用提取程序以声明方式分析请求。 简单且可预测错误处理模型。

    8.6K51

    rust warp框架教程1-helloworld

    ; map 接受一个闭包,将前面提取路径参数请求头参数都提取为 String 类型,传入闭包,闭包将返回一个组装字符串。...从这个示例,我们可以看到,warp带来非常灵活 Filter 系统,可以让我们很容易处理 HTTP 各种参数。...安装warp框架 在 rust 安装 warp 是非常简单使用 cargo 即可。这里介绍安装 warp 框架是为了介绍目前 rust 开发 web 相关库。...pretty_env_logger 可以在控制台输出比较漂亮日志记录,pretty_env_loggor 作者也是 warp 作者; tokiorust 社区中比较常用异步运行时,我们使用...部署相关 warp 框架本身就是 hyper 这样 HTTP 服务器,因此在部署时候是不需要额外动态服务器,它本身就提供了 HTTP 服务器。因此,通常只需要使用一个静态服务器做反向代理即可。

    1K40

    Rust:axum学习笔记(4) 上传文件

    接上一篇继续,上传文件是 web开发常用功能,本文将演示axum如何实现图片上传(注:其它类型文件原理相同),一般来说要考虑以下几个因素: 1. 文件上传大小限制 2....防止伪装mimetype进行攻击(比如:把.js文件改后缀变成.jpg伪装图片上传,早期有很多这类攻击) 另外,上传图片后,还可以让浏览器重定向到上传后图片(当然,仅仅只是演示技术实现,实际应用并非一定要这样...: #[tokio::main] async fn main() { // Set the RUST_LOG, if it hasn't been explicitly defined...= ["fs", "trace"] } futures = "0.3" tokio-stream = "0.1" headers = "0.3" tracing = "0.1" tracing-subscriber...::var_os("RUST_LOG").is_none() { std::env::set_var("RUST_LOG", "example_sse=debug,tower_http=

    2.3K21

    Rust生态安全漏洞总结系列 | Part 3

    本系列主要是分析`RustSecurity` 安全数据库库[1]记录Rust生态社区中发现安全问题,从中总结一些教训,学习Rust安全编程经验。...虽然不是严格要求,但使用OpenSSL自己 "d2i "函数(其他类似的解析函数)解析ASN.1字符串,以及任何用ASN1_STRING_set()函数设置字符串,都会在ASN1_STRING...然而,应用程序有可能直接构建有效ASN1_STRING结构,通过直接设置ASN1_STRING数组 "data " "length "字段,不以NUL方式终止字节数组。...解决问题思路是: Timestamp::normalize可能应该使用 `saturating_{add,sub}`[31] 方法,如果时间nanos字段超出了范围,这可能会默默地改变时间戳,最多.../security/advisories/GHSA-f3pg-qwvg-p99c 补丁:>=0.14.10 漏洞分析 hyperHTTP/1服务器代码存在一个缺陷,即错误地解析接受带有前缀加号Content-Length

    88830

    Rust日报】2023-06-20 使用Quickwit、JaegerGrafana监控您Rust应用程序

    我们目标将是双重使用广泛认可 Jaeger UI 分析跟踪,以获取有关应用程序行为见解。 从这些跟踪数据中派生 RED(速率、错误持续时间)指标,并在 Grafana 监视它们。...也就是说,我们一个接一个地进行了二十次请求。这使得整个请求处理时间更长(上面为 4.39s)。 但我们能不能更好地做? 在 Rust 开发人员拥有的所有优秀工具,答案是显而易见 "是的!"。...让我们利用 Tokio Rust futures crate 异步流特性,通过并行获取评论。 让我们更新我们 fetch_posts 函数,以批量并行运行请求,每次同时进行十个请求。...我们想要从我们跟踪构建 RED 指标并在 Grafana 可视化它们。 转到 http://localhost:3000/login,使用admin作为用户名密码登录。...为了观察这些指标的运行情况,您可以使用 HTTP 基准测试工具,甚至可以使用本教程提供 此脚本发送多个并发请求到您 Rust 应用程序。

    65820

    你应该知晓Rust Web 框架

    Axum 不仅使用 Tokio 作为其异步运行时,还与 Tokio 生态系统其他库集成,利用 Hyper[3] 作为其 HTTP 服务器 Tower[4] 作为中间件。...通过这样做,我们能够重用 Tokio 生态系统现有的库工具。 Axum 「不依赖于宏」,而是利用 Rust 类型系统提供安全且人性化 API。...我们使用宏来定义 HTTP 方法路由(类似于 Rocket),并使用提取器(extractors)从请求获取数据(类似于 Axum)。...Rocket Rocket[6] 在 Rust Web 框架生态系统已经有一段时间了:它主要特点是基于宏路由、内置表单处理、对数据库状态管理支持,以及其自己版本模板!...乍一看,它使用方式与 Axum 非常相似,唯一区别是它需要使用相应宏标记处理程序函数。它还建立在 Tokio Hyper 之上,完全兼容 Tower 中间件,同时仍然暴露自己中间件特性。

    2.5K21

    Rust第二次接触-写个小服务器程序

    现在似乎很多Rust库都按Tokio模式来,于是我看了一下基于Futures多路复用IO库Tokio文档来练习一下这个小服务器程序。 至于写个啥呢?...最终选择了actix-web ,actix-web 支持websocket,支持HTTP/HTTPS ,可定制化尚可,又不像hyper那样提供过于底层接口据难用,也不像rocket那样提供封装过于高层...面向对象惯性思维冲突 在写这个程序时候,发生了几次思维模式上冲突。一开始我想使用actix-web自定义handle方式来处理请求调度。...,说是Rust要搞个官方流程futuresawait流程。...在写这篇总结过程,我又看到篇长长长长长文章, http://bryangilbert.com/post/code/rust/adventures-futures-tokio-rust/ 写得比较白话文一点

    82320

    Rust日报】2020-01-02 The Embedded Working Group Newsletter - 22

    兴趣涉及事物实时性并行性,但是我对 Tokio 本身并不了解。...在引入异步稳定期货之前,我或多或少有意地避免学习它,这并不是毫无道理认为 Tokio 是错,但是只有有限时间来学习东西,学习一些新东西是一项艰巨任务。”...我不知道我要长期构建什么,但是一个 HTTP 负载生成器可以很好地工作,它可以扩展自身以找到服务器每秒可以处理最大请求,同时仍然满足一些延迟约束。...这确实意味着我需要将我学习与另一个库 - hyper 相结合,但是我以前使用过它,并且认为我可以将其保留为黑匣子。”...使用 Rust WebAssembly,可以使用更快,一致 WebAssembly 代码轻松弥补这些领域不足。

    49920

    Rust日报】 2019-12-23 Trust-DNS 0.18发布,具备异步等待支持Tokio 0.2兼容性。

    MongoDb团队发布正式Alpha版本客户端 这是一个完全重写项目,旧客户端已经被放弃。 MongoDB在Rust方面拥有长时间研究。...0.18发布,具备async/await支持Tokio 0.2兼容性 async/await一直是Rust中一个期待已久功能。...尽管Futures库通过为我们提供针对常见场景预定义状态机确实起到了很大帮助作用,但RustFutures原始版本没有什么不同。...从某些代码可以最容易地看出这是更符合人体工程学示例,这是先前版本TrustS-DNS(HTTPS请求处理程序)示例: pub fn h2_handler( handler:...thatcord原型Rust Discord库支持tokio 0.2,futures 0.3异步/等待。由于过于强调原型,因为它目前只能接收,不能发送。并且仅支同时持两个进程。

    66510

    Rust第二次接触-写个小服务器程序

    原来很多客户端程序思路是不太一样。所以本来想等新Futuresawait2.0版本宏机制完成再搞。而老Futures库由于即将移入核心库,在crates.io上下架了。...现在似乎很多Rust库都按Tokio模式来,于是我看了一下基于Futures多路复用IO库Tokio文档来练习一下这个小服务器程序。 至于写个啥呢?...最终选择了actix-web ,actix-web 支持websocket,支持HTTP/HTTPS ,可定制化尚可,又不像hyper那样提供过于底层接口据难用,也不像rocket那样提供封装过于高层...面向对象惯性思维冲突 在写这个程序时候,发生了几次思维模式上冲突。一开始我想使用actix-web自定义handle方式来处理请求调度。...在写这篇总结过程,我又看到篇长长长长长文章, http://bryangilbert.com/post/code/rust/adventures-futures-tokio-rust/ 写得比较白话文一点

    4.1K30

    Rust日报】 2019-12-17 hyper v0.13.0最终版本现已准备就绪

    使用Rust将GIF里动态图片分解出来,保存到PowerPoint 有时候你看到一张动态图片(GIF),感觉其中一个画面你觉得很不错,想从中提取出来....Read more 如何在2019年最后一次加速Rust编译器 作者上次写于10月文章是关于加速Rust编译器工作。 随着年底临近,是时候进行更新了。...2019 Read more 经过几个月开发,hyper v0.13.0最终版本现已准备就绪!...hyper是一个用Rust编写成熟HTTP库,已经是其中最快HTTP库之一,并因其正确性而受到许多人信任。 此版本亮点: Full async/await support....Tokio v0.2 upgrade. Adopting tower::Service. Read more ---- From 日报小组 @joshsulin

    45710
    领券