Search code examples
c++qthttprequesthtmlqnetworkaccessmanager

Getting a page content with Qt


I am trying to get the content of a HTTP request into a QString variable with Qt and C++

QNetworkAccessManager networkManager;

QUrl url("https://someurl.test.com/this-actually-exists");
QNetworkRequest request;
request.setUrl(url);

QNetworkReply* currentReply = networkManager.get(request);  // GET

QString reply = QTextCodec::codecForMib(1015)->toUnicode(currentReply->readAll());

Still, the variable reply seems to stay empty. Obviously, I misunderstand the documentation. How do I get this to perform?


Solution

  • You can use two different ways even the synchronous or asynchronous ways to do this. The asynchronous way is :

    connect (&networkManager , SIGNAL(finished(QNetworkReply*)) ,this, SLOT(done(QNetworkReply*)));
    
    networkManager.get(request);
    

    And you should read the contents from the returned reply in the slot connected to finished signal in the following way :

    void net::done(QNetworkReply * reply) 
    {
        if (reply->error() == QNetworkReply::NoError)
        {
           data = QString(reply->readAll ());
        }
        else
        {
           data = QString(reply->errorString ());
        }
    }
    

    The synchronous way is like :

       QNetworkReply *reply = networkManager.get(request);
    
       QEventLoop loop;
       connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
       connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), &loop, SLOT(quit()));
       loop.exec();
    
       QByteArray bts = reply->readAll();
       QString str(bts);
    

    Here you use an event loop to wait until the reply is finished and then read the available bytes and get the string.