Чтение потока отправленных событий (SSE) в клиенте cpprest - PullRequest
0 голосов
/ 22 января 2019

Я хотел бы знать, есть ли какая-либо поддержка событий, отправляемых сервером, в cpprestsdk? У меня есть функция eventGet (), которая отправит HTTP-запрос и получит ответ от сервера. Однако функция может получить только первое событие, а затем просто подождать.

Есть идеи, как эту функцию можно использовать для чтения нескольких событий с сервера?

pplx::task<std::shared_ptr<Object>> MyApi::eventsGet()
{
    std::shared_ptr<ApiConfiguration> apiConfiguration( m_ApiClient->getConfiguration());
    utility::string_t path = utility::conversions::to_string_t("/Events");

    std::map<utility::string_t, utility::string_t> queryParams;
    std::map<utility::string_t, utility::string_t> headerParams( apiConfiguration->getDefaultHeaders());
    std::map<utility::string_t, utility::string_t> formParams;
    std::map<utility::string_t, std::shared_ptr<HttpContent>> fileParams;
    std::unordered_set<utility::string_t> responseHttpContentTypes;

    responseHttpContentTypes.insert( utility::conversions::to_string_t("text/event-stream"));
    utility::string_t responseHttpContentType;
    headerParams[utility::conversions::to_string_t("Accept")] = responseHttpContentType;
    std::unordered_set<utility::string_t> consumeHttpContentTypes;
    std::shared_ptr<IHttpBody> httpBody;
    utility::string_t requestHttpContentType;

    return m_ApiClient->callApi(path, utility::conversions::to_string_t("GET"), queryParams, 
    httpBody, headerParams, formParams, fileParams, requestHttpContentType)
    .then([=](web::http::http_response response)
    {
        auto stream = response.body();

        Concurrency::streams::container_buffer<std::string> line;
        stream.read_line(line).then([line](size_t bytesRead)->size_t 
        {
            const std::string &readText = line.collection();
            std::cout << readText << std::endl;

            return bytesRead;
        }
    ...

    }
}

Я попытался добавить цикл while внутри функции eventGet (), чтобы получить response.body () для каждой итерации. Затем readText правильно получает данные первого события, но выводит пустую строку после этого, когда происходит новое событие.

while (true) 
{
    auto stream = response.body();
    Concurrency::streams::container_buffer<std::string> line;   
    stream.read_line(line).then([line](size_t bytesRead) -> size_t 
    {
        const std::string &readText = line.collection();
        std::cout << readText.c_str() << std::endl;
        return bytesRead;
    });
}
...