【问题标题】:Poco HTTPClientSession.receiveResponse returns status 200 but empty response in c++11?Poco HTTPClientSession.receiveResponse 在 c++11 中返回状态 200 但为空响应?
【发布时间】:2013-07-18 03:47:02
【问题描述】:

我有一段简单的代码连接到一个基本的 HTTP 服务器,它总是返回一个明文 JSON 字符串。在我升级到 gcc 4.8 以访问 c++11 功能之前,我使用了一直工作的 Poco::net 库。我尝试过使用各种服务器,但出现相同的行为,所以这是客户端。

响应的状态为 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 测试过

【问题讨论】:

    标签: c++ c++11 istream poco-libraries


    【解决方案1】:

    您是否正确编译了库?我在 MinGW 上遇到了同样的问题,在 MacOSX 上试了一下,效果很好。尝试彻底阅读自述文件: https://github.com/sebastient/poco/blob/master/README

    【讨论】:

      【解决方案2】:

      你可能想检查类似的输出

      std::cout << is.rdbuf() << std::endl;
      

      is.gcount() 可能为 0,因为您还没有执行任何未格式化的输入操作——如果您先执行is.getline(),它会显示什么?

      【讨论】:

        【解决方案3】:

        您可以使用此代码来制作 istream 的字符串形式。也许这是你的解决方案。这是一个函数,您应该传递 std::stream 并将其转换为字符串并返回结果字符串。

                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;
            }
        

        【讨论】:

          猜你喜欢
          • 2020-09-02
          • 1970-01-01
          • 2020-11-10
          • 1970-01-01
          • 1970-01-01
          • 2018-03-09
          • 2020-09-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多