如何使用QNetworkManager for REST api?

时间:2015-05-11 16:34:56

标签: c++ qt rest network-programming

我想创建一个通过REST API访问数据的类,例如:

class MeteoStation{
   int getLatestTemperature();
   int getLatestPessure();
   private:
   QNetworkManager nmng;
}

我怎样才能实现这种方法?通常我使用的是:

   int MeteoStation::getLatestTemperature(){    
      ...
      QEventLoop eventLoop;
      connect(&m_nam,SIGNAL(finished(QNetworkReply*)),&eventLoop,SLOT(quit()));
      QNetworkReply *reply = m_nam.get( req );
      eventLoop.exec();
      reply->readAll()
      ...
    }

但是由于不推荐使用内部QEventLoop,我应该如何看待响应属于谁?

MeteoStation::MeteoStation(){
   connect(&nmam, SIGNAL(finished(QNetworkReply*)),
                     this, SLOT(parseNetworkResponse(QNetworkReply*)));
}

void MeteoStation::parseNetworkResponse( QNetworkReply *finished )
{
   QByteArray data = finished->readAll();
...

是的,让类线程保存会很好。你是如何在代码中解决的?

使调用与以下内容同步有多糟糕:

QNetworkRequest req(url);
QScopedPointer<QNetworkReply> reply(nam.get(req));

QTime timeout= QTime::currentTime().addSecs(10);
while( QTime::currentTime() < timeout && !reply->isFinished()){
    QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}

if (reply->error() != QNetworkReply::NoError) {
    qDebug() << "Failure" <<reply->errorString();
}
QByteArray data = reply->readAll();

2 个答案:

答案 0 :(得分:3)

我使用QCoreApplication :: processEvents()解决了我的问题。响应在ms内,我能够实现接近libcurl的功能。

Y2015-M04-D18

答案 1 :(得分:1)

Qt文档应该提供您需要的所有信息。 你创建一个nam,连接完成的信号,发送请求。

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
        this, SLOT(parseNetworkResponse(QNetworkReply*)));

manager->get(QNetworkRequest(QUrl("http://qt-project.org")));

检测回复所属的请求不应该太难。回复包含网址。它可能有所不同,但 不同:

  

......但由于各种原因,它可能会有所不同(例如,a   文件路径是绝对的或规范的。)

QUrl QNetworkReply :: url()const

  

返回下载或上传的内容的网址。请注意   URL可能与原始请求的URL不同。