使用libcurlpp时如何提取http响应?

时间:2011-02-15 20:26:51

标签: libcurl curlpp

尝试使用libcurlpp(libcurl的C ++包装器)发布表单并获取响应。这一切都有效,但我不知道如何在http事务完成后以编程方式访问curlpp :: Easy对象的响应。 Bascially:

#include <curlpp/Easy.hpp>
#include <curlpp/Options.hpp>
...
curlpp::Easy foo;
foo.setOpt( new curlpp::options::Url( "http://example.com/" ) );
foo.setOpt( new curlpp::options::Verbose( true ) );
...many other options set...
foo.perform();  // this executes the HTTP transaction

当此代码运行时,因为Verbose设置为true,我可以看到响应输出到STDOUT。但是如何获得完整的响应而不是将其转储到STDOUT? curlpp :: Easy似乎没有任何方法可以访问响应。

谷歌有很多点击,人们问同样的问题,但没有回复。 curlpp邮件列表是一个死区,curlpp网站的API部分已经被打破了一年。

4 个答案:

答案 0 :(得分:9)

这就是我最终做到的:

// HTTP response body (not headers) will be sent directly to this stringstream
std::stringstream response;

curlpp::Easy foo;
foo.setOpt( new curlpp::options::Url( "http://www.example.com/" ) );
foo.setOpt( new curlpp::options::UserPwd( "blah:passwd" ) );
foo.setOpt( new curlpp::options::WriteStream( &response ) );

// send our request to the web server
foo.perform();

foo.perform()返回后,WriteStream()中提供的信息流现已提供完整的回复正文。

答案 1 :(得分:0)

自提出问题以来,也许curlpp已经更新。我正在使用我在example04.cpp。

中找到的这个
#include <curlpp/Infos.hpp>

long http_code = 0;
request.perform();
http_code = curlpp::infos::ResponseCode::get(request);
if (http_code == 200) {
    std::cout << "Request succeeded, response: " << http_code << std::endl;
} else {
    std::cout << "Request failed, response: " << http_code << std::endl;
}

答案 2 :(得分:0)

这是一个比其他示例稍微完整的示例。它借鉴了Stephane和kometen的答案,并且将它们组合在一起以确保可以获得HTTP响应代码。

void
runBadQuery() {
    curlpp::Easy request;
    std::ostringstream stream;

    request.setOpt<curlpp::options::Url>("http://localhost:3010/bad");
    request.setOpt( new curlpp::options::WriteStream( &stream ) );
    request.perform();

    long http_code = curlpp::infos::ResponseCode::get(request);
    cout << "/bad got code: " << http_code << " And content: " << stream.str() << endl;
}

在我的示例服务器上运行时的输出是:

/bad got code: 400 And content: {
  "error": "Illegal request"
}

(我的示例服务器返回JSON。)

答案 3 :(得分:0)

此代码也有效,它来自 This Answer :

#include <curlpp/cURLpp.hpp>
#include <curlpp/Options.hpp>

// RAII cleanup

curlpp::Cleanup myCleanup;

// Send request and get a result.
// Here I use a shortcut to get it in a string stream ...

std::ostringstream os;
os << curlpp::options::Url(std::string("http://example.com"));

string asAskedInQuestion = os.str();