我有一段简单的代码连接到基本的HTTP服务器,该服务器总是返回明文JSON字符串。我使用了Poco :: net库,直到我升级到gcc 4.8才能访问c ++ 11的功能。我尝试过使用各种服务器,但是会出现相同的行为,所以这是客户端。
响应的状态为200 OK,我甚至检查了内容长度,这与服务器响应的内容完全匹配,因此有些响应消息的接收方式如何,但它没有被提供。
URI m_uri("http://www.bbc.co.uk");
m_uri.setPort(80);
HTTPClientSession m_session(m_uri.getHost(),m_uri.getPort());
m_session.setKeepAlive(true);
// send request
HTTPRequest req(HTTPRequest::HTTP_GET, "/news/", HTTPMessage::HTTP_1_1);
m_session.sendRequest(req);
// get response
HTTPResponse res;
istream& is = m_session.receiveResponse(res);
cout << res.getStatus() << " " << res.getReason() << " ,length = " << res.getContentLength() << " , type = " <<res.getContentType() << ", keepalive = " << res.getKeepAlive() << endl; // return 200 OK, correct content length on my real server, etc.
cout << "good " << is.good() << endl; // istream is good, but gcount is 0
// Copy response
string results;
// StreamCopier::copyToString(is, results); // Fails with c++11
is >> results;
cout << results <<endl; // blank
if (results.empty())
cout << "Error" << endl; // yep, empty.
真的不知所措。我尝试从源代码编译最新的Poco强制使用gcc无济于事。花了几天时间试图搞清楚但没有取得任何进展。我在MacOSX Lion,gcc 4.8 Poco 4.3和4.6测试
答案 0 :(得分:1)
您可以使用此代码来生成istream的字符串形式。也许这是你的解决方案。这是一个函数,你应该传递std :: stream并将它转换为string并返回结果字符串。
std::string convertFromStreamToString(std::istream &in){
std::string ret;
char buffer[4096];
while (in.read(buffer, sizeof(buffer))){
ret.append(buffer, sizeof(buffer));
}
ret.append(buffer, in.gcount());
return ret;
}
答案 1 :(得分:0)
您是否正确编译了库?我在MinGW上遇到了同样的问题,在MacOSX上试过它并且运行正常。尝试彻底阅读README: https://github.com/sebastient/poco/blob/master/README
答案 2 :(得分:0)
您可能想检查
之类的输出std::cout << is.rdbuf() << std::endl;
is.gcount()
可能为0,因为您还没有执行任何未格式化的输入操作 - 如果您首先执行is.getline()
会显示什么?