首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >cpprestsdk:句柄块响应

cpprestsdk:句柄块响应
EN

Stack Overflow用户
提问于 2017-03-21 09:32:44
回答 1查看 2K关注 0票数 3

如何使用cpprestsdk处理块响应?如何请求下一块?这里是否有所需的功能?

下面是我们执行http请求的方式:

代码语言:javascript
运行
复制
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:组或资源未处于执行请求操作的正确状态。

EN

回答 1

Stack Overflow用户

发布于 2019-08-14 21:38:33

为了读取大量接收到的数据,需要从服务器响应中获取输入流。

代码语言:javascript
运行
复制
concurrency::streams::istream bodyStream = response.body();

然后从该流中连续读取,直到找到给定的字符或读取指定字节数为止。

代码语言:javascript
运行
复制
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);
});
}

下面是完整的示例:stream

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42923074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档