簡體   English   中英

從客戶端向服務器發送數據 response_tak = client.request(req) 如果在特定時間沒有響應,我想添加超時功能

[英]Sending data from client to server response_tak = client.request(req) I want to add timeout functionality if response doesn't come in particular time

 utility::string_t url = U("http://localhost:8080/api/v1/post_info");
 web::uri uri1( url);
 web::http::client::http_client client( uri1);
 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);
 response_task = client.request(request);
 response = response_task.get();

如果響應不是來自client.request(request); 或者如果花費太多時間,那么 My.exe 將繼續等待? 所以我該怎么做?

web::http::client::http_client::http_client( const uri &base_uri, const http_client_config &client_config );

在 cpprestsdk 庫中有這個 function 但沒有太多關於這個http_client_config類的utility::seconds web::http::client::http_client_config::timeout()const function。

您可以通過創建 http_client_config object 並使用void web::http::client::http_client_config::set_timeout ( const T & timeout )為所有請求設置超時, 文檔 然后你需要將配置 class 作為第二個參數傳遞給構造函數,使用你提到的方法web::http::client::http_client::http_client( const uri &base_uri, const http_client_config &client_config );

class pplx::task<web::http::http_response>是異步的,如果你直接調用.Get()它將被阻塞。 您應該檢查響應是否已經存在

bool done = resp.is_done();

或使用回調 function

resp.then([=](pplx::task<web::http::http_response> task)
{
    web::http::http_response  response = task.get();
    ...
});

如果 is_done() 返回 false,調用 get() 將有阻塞線程的風險,這首先違背了使用異步 API 的目的(它將阻止 GUI 刷新和服務器縮放)。 對於這種情況,我們需要采取不同的方法:將處理程序 function 附加到任務,任務完成后將調用該處理程序。 我們使用 then() function 來做到這一點

更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2023 STACKOOM.COM