1

常にプレーンテキストの JSON 文字列を返す基本的な HTTP サーバーに接続する単純なコードがあります。c++ 11機能にアクセスするためにgcc 4.8にアップグレードするまで、findで機能する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をテストしています

4

3 に答える 3

1

このコードを使用して、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;
    }
于 2017-06-02T12:03:49.213 に答える
0

ライブラリを正しくコンパイルしましたか? MinGW で同じ問題が発生し、MacOSX で試してみたところ、問題なく動作しました。README をよく読んでみてください: https://github.com/sebastient/poco/blob/master/README

于 2013-08-21T08:11:29.320 に答える