我应该如何使用cpprestsdk处理分块响应?如何申请下一个块?那里是否需要功能?
以下是我们执行http请求的方式:
web::http::http_request request(web::http::methods::GET);
request.headers().add(LR"(User-Agent)", LR"(ExchangeServicesClient/15.00.0847.030)");
request.headers().add(LR"(Accept)", LR"(text/xml)");
request.set_body(L"request body", L"text/xml");
web::http::client::http_client_config clientConfig;
clientConfig.set_credentials(web::credentials(L"username", L"pass"));
clientConfig.set_validate_certificates(true);
web::http::client::http_client client(L"serviceurl", clientConfig);
auto bodyTask = client.request(request)
.then([](web::http::http_response response) {
auto str = response.extract_string().get();
return str;
});
auto body = bodyTask.get();
如果我在天真地尝试执行另一个请求,那么我就会出错:
WinHttpSendRequest:5023:组或资源未处于正确状态以执行 要求的操作。
答案 0 :(得分:0)
为了分块读取接收到的数据,需要从服务器响应中获取输入流
concurrency::streams::istream bodyStream = response.body();
然后从该流中连续读取,直到找到给定的char或读取指定的字节数为止
pplx::task<void> repeat(Concurrency::streams::istream bodyStream)
{
Concurrency::streams::container_buffer<std::string> buffer;
return pplx::create_task([=] {
auto t = bodyStream.read_to_delim(buffer, '\n').get();
std::cout << buffer.collection() << std::endl;
return t;
}).then([=](int /*bytesRead*/) {
if (bodyStream.is_eof()) {
return pplx::create_task([]{});
}
return repeat(bodyStream);
});
}