如何为cpprestsdk的HTTP客户端请求添加超时功能?
解决cpprestsdk HTTP请求超时问题
你的代码中调用response_task.get()会阻塞当前线程直至请求完成,若服务无响应会一直等待。要解决这个问题,核心是通过http_client_config配置请求超时时间,具体步骤如下:
1. 配置http_client_config的超时参数
创建http_client_config实例,调用set_timeout()方法设置超时时长(单位为秒),再将该配置传入http_client的构造函数。当请求总耗时超过设定值时,会自动终止并抛出超时异常。
2. 修改后的完整代码示例
utility::string_t url = U("http://localhost:8080/api/v1/post_info"); web::uri uri1(url); // 配置客户端超时 web::http::client::http_client_config config; config.set_timeout(utility::seconds(10)); // 设置10秒超时 web::http::client::http_client client(uri1, config); // 传入配置 web::http::http_request request; pplx::task<web::http::http_response> response_task; web::http::http_response response; request.set_method(web::http::methods::POST); request.set_body(jsondata); try { response_task = client.request(request); response = response_task.get(); // 处理正常响应 } catch (const std::exception& e) { // 捕获超时或其他请求异常 std::cout << "请求出错: " << e.what() << std::endl; }
关于timeout()方法的说明
http_client_config::timeout()用于获取当前设置的超时时长,对应的set_timeout()用于设置超时,单位是utility::seconds(秒)。- 该超时是请求的总时长限制,涵盖TCP连接建立、请求发送、响应接收的全部过程,并非单独某一步的超时。
- 超时发生时,
client.request()会抛出web::http::http_exception或派生异常,需通过try-catch块捕获处理,避免程序长时间阻塞或崩溃。
内容的提问来源于stack exchange,提问作者Abhishek Mane
相关产品推荐
相关产品推荐

