我正在尝试学习2件事:
1)一些基本的C ++ STL(我是旧的C / C ++编码器,试图学习新知识)
2)如何使用CPPRest library通过REST服务访问我的Wunderlist帐户。

我已经能够使用Wunderlist成功启动oauth2进程,但是为了帮助我了解发生了什么并被返回,我要做的就是打印结果字符串。对于我的一生,我不知道该怎么做。它与操纵iostream有关,但是由于我是新手,所以我很努力。

这是一个代码片段,可以成功地将HTML从初始Wunderlist响应中获取到streambuf中,但是我无法将其获取到用于打印(或其他内容)的字符串中。请注意,我不关心异步执行此操作;因此,我只是通过!task.is_done()强制进行同步。另外,如果要编译和运行,则需要为Wunderlist提供自己的client_id,或者使用其他服务。

#include "stdafx.h"
#include <cpprest/http_client.h>
#include <cpprest/oauth2.h>

using namespace utility;                    // Common utilities like string conversions
using namespace web;                        // Common features like URIs.
using namespace web::http;                  // Common HTTP functionality
using namespace web::http::client;          // HTTP client features
using namespace concurrency::streams;       // Asynchronous streams
using namespace web::http::oauth2::details;

int main()
{
    http_client clientWL(U("https://www.wunderlist.com"));
    uri_builder builderWL(U("oauth/authorize"));
    builderWL.append_query(U("client_id"), U("[myclientid]"));
    builderWL.append_query(U("redirect_uri"), U("http://www.google.com"));
    builderWL.append_query(U("state"), U("Randomish"));

    auto task = clientWL.request(methods::GET, builderWL.to_string());
    while (!task.is_done());

    http_response resp1 = task.get();
    Concurrency::streams::basic_ostream<char> os = Concurrency::streams::container_stream<std::string>::open_ostream();
    Concurrency::streams::streambuf<char> sb = os.streambuf();

    Concurrency::task<size_t> task2 = resp1.body().read_to_end(sb);
    while (!task2.is_done());

    // HOW DO I GET THE RESULTING HTML STRING I CAN PLAINLY SEE IN sb
    // (VIA A DEBUGGER) INTO THE FOLLOWING STRING OBJECT?
    std::string strResult;

    return 0;
}

最佳答案

有一种与平台无关的从http_response对象提取字符串的方法:

http_response resp1 = task.get();
auto response_string = resp1.extract_string().get();
std::cout << response_string << std::endl; // Will print it to stdout

10-05 19:04