C++实现带有重试机制的HTTP异步请求 _ 结合Boost.Asio与future【源码】

冬婷吖_5631

冬婷吖_5631

2026-05-24

710人浏览

原创

需引入重试逻辑与异步执行能力:一、用steady_timer实现指数退避重试;二、用packaged_task封装并返回future;三、用awaitable协程简化流程;四、用retrypolicy类解耦重试策略;五、用自定义completion_token注入重试逻辑。

c++实现带有重试机制的http异步请求 _ 结合boost.asio与future【源码】

如果您在C++中需要发起HTTP请求并确保网络波动或临时失败时仍能成功获取响应,则需引入重试逻辑与异步执行能力。以下是基于Boost.Asio实现带有重试机制的HTTP异步请求,并通过std::future获取结果的具体方法:

一、使用boost::asio::steady_timer配合async_wait实现指数退避重试

该方法利用steady_timer在每次请求失败后按指数增长的时间间隔触发下一次重试,避免密集轮询,同时保持异步非阻塞特性。每个重试尝试均封装为独立的async_connect → async_write → async_read操作链,失败时递归调度下一次重试。

1、定义重试参数:设置最大重试次数为3次,初始延迟为100毫秒,退避因子为2。

2、构造io_context对象与tcp::resolver实例,用于DNS解析与连接管理。

3、在首次请求失败回调中,检查当前重试计数;若未达上限,则创建steady_timer对象,设置超时时间为当前延迟值,并调用async_wait绑定重试发起函数。

4、重试发起函数中更新延迟值(乘以退避因子),并重新执行完整的HTTP GET请求流程。

5、所有异步操作均通过post或dispatch提交至io_context,确保线程安全与执行上下文一致。

二、封装异步操作为std::packaged_task并返回std::future

该方法将整个HTTP请求及重试逻辑封装进std::packaged_task,使其可被io_context.post调度执行,并通过get_future()暴露外部等待接口,使调用方能以同步风格等待异步结果。

1、声明std::promise<:string>对象,用于存储最终响应体或错误信息。

2、构造std::packaged_task,其可调用对象内部包含完整的带重试的异步请求流程,并在成功读取响应后调用promise.set_value(),失败时调用promise.set_exception()。

3、将packaged_task通过io_context.post投递执行,立即返回对应std::future<:string>。

4、future支持调用.wait()阻塞等待,或.wait_for()设定超时,亦可直接.get()提取结果或传播异常。

三、使用boost::asio::awaitable配合co_await实现协程式重试流程

该方法借助Boost.Asio 1.70+提供的awaitable协程支持,将重试循环、超时控制与HTTP交互步骤自然地组织为顺序代码结构,避免回调嵌套,提升可读性与调试便利性。

1、定义返回类型为boost::asio::awaitable<:string>的协程函数,接收host、port、target等参数。

2、在协程体内使用boost::asio::use_awaitable作为完成令牌,调用async_connect、async_write、async_read等异步函数,每一步均以co_await挂起并自动恢复。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

3、在外层while循环中控制重试次数,每次失败后调用co_await boost::asio::steady_timer(...).async_wait(boost::asio::use_awaitable),实现可控暂停。

4、将awaitable对象通过boost::asio::co_spawn提交至io_context,同时绑定处理完成回调,其中调用promise.set_value或set_exception。

5、外部通过promise.get_future()获取结果,无需感知协程调度细节。

四、集成boost::beast::http::async_read与自定义重试策略类

该方法将重试逻辑抽象为独立的RetryPolicy类,与beast的HTTP组件解耦,支持灵活配置重试条件(如仅对5xx响应重试)、最大持续时间、抖动因子等,提高复用性与测试性。

1、定义RetryPolicy接口,包含should_retry(const beast::error_code&, const http::response<:dynamic_body>&)和next_delay()成员函数。

2、在HTTP请求完成后,由policy判断是否应重试;若返回true,则计算下一次延迟并启动timer异步等待。

3、每次重试前克隆request对象,防止body被多次序列化或移动失效。

4、使用beast::flat_buffer管理读取缓冲区,确保多次read操作复用同一内存块。

5、所有beast异步操作统一使用同一个executor,避免跨executor访问导致未定义行为。

五、基于completion_token定制重试完成处理器

该方法通过自定义CompletionToken机制,在每次异步操作完成时注入重试决策逻辑,无需修改原始asynchronous operation签名,符合Boost.Asio的设计哲学。

1、定义retrying_completion_token模板类,继承自boost::asio::completion_token_for,重载operator()以包裹原始handler。

2、在operator()内部捕获error_code,根据预设规则决定是否重新发起请求;若是,则构造新请求并再次调用async_initiate流程。

3、将retrying_completion_token实例传入async_connect等函数,替代默认use_default_token。

4、原始handler仅在最终成功或耗尽重试次数后被调用,其参数包含完整响应或最后一次失败的error_code。

5、token内部维护重试计数器与延迟状态,确保每次重试上下文隔离且可追踪。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2248

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1039

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

426

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

600

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1429

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1237

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习