如何将QnetworkManager用于REST API

How to use QNetworkManager for REST api?

本文关键字:REST API 用于 QnetworkManager      更新时间:2023-10-16

我想做一个通过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();

我使用qcoreapplication :: processevents()解决了问题。响应在MS中存在,我能够在靠近libcurl的功能中实现功能。

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();

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

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
        this, SLOT(parseNetworkResponse(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://qt-project.org")));

检测请求属于的请求不应该太难。答复包含URL。它可能有所不同,但不是不同:

...但是出于多种原因可能会有所不同(例如,一个 文件路径是绝对或规范的)。

Qurl Qnetworkreply :: url()const

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