【问题标题】:Qt QNetworkAccessManager & simple web service returnQt QNetworkAccessManager & 简单的 web 服务返回
【发布时间】:2014-08-23 13:18:25
【问题描述】:

我有一个简单的 Web 服务,其 URL 如下:

http://localhost:8080/WebSvc1/webresources/generic/data?ctype=Ping

这会返回一个简单的 XML 数据:

<CALL TYPE='Ping'><IP>10.0.0.10</IP></CALL>

我正在尝试编写一个 Qt 程序来调用这个 Web 服务。

调用代码如下:

  QUrl qrl("http://localhost:8080/WebSvc1/webresources/generic/data?ctype=Ping");
  manager = new QNetworkAccessManager(this);
  connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
  printf ("Calling url: [%s]\n", qPrintable(url));
  QNetworkReply *reply = 0;
  reply = manager->get(QNetworkRequest(qrl));
  qDebug() << reply->readAll();

我期待/希望 readAll 将获取 XML 文本数据并打印它(通过 qDebug)。

相反,我什么也没看到,程序只是挂起。

更新,也有这个:

void obj::replyFinished(QNetworkReply *reply)
{
qDebug() << reply->readAll();
}

【问题讨论】:

  • 我不太确定,所以现在我发表评论。尝试创建槽 replyFinished 并在这个槽中写入 qDebug()readAll() 现在 ir 工作了吗?
  • 我有这个: void iwbWSCall::replyFinished(QNetworkReply *reply) { qDebug() readAll(); } 但仍然没有什么不同。

标签: qt qnetworkaccessmanager qnetworkrequest


【解决方案1】:

我提供了一个适合您的示例(强制同步请求 回复交换以简化调试过程):

QUrl qrl("http://localhost:8080/WebSvc1/webresources/generic/data?ctype=Ping");
qDebug() << "Calling url: " << qrl.toString();
manager = new QNetworkAccessManager();
QNetworkReply* reply = manager->get(QNetworkRequest(qrl));
QEventLoop eventLoop;
connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
eventLoop.exec();
if (reply->error() != QNetworkReply::NoError)
{
    qDebug() << "Network error: " << reply->error();
}
else
{
    qDebug() << reply->readAll();
}

请注意,finished 信号的“发射器”不是QNetworkAccessManager,而是reply 本身。

【讨论】:

    【解决方案2】:

    我认为您的错误可能与您的网络服务有关。我用 httpbin.org 试用了你的代码(稍作修改),并得到了正确的回复。也许用 httpbin.org 看看你的代码,然后看看你是否能找出你的服务出了什么问题。

    MainWindow.cpp

    #include "MainWindow.hpp"
    #include <QUrl>
    #include <QNetworkRequest>
    #include <QNetworkReply>
    #include <QNetworkAccessManager>
    #include <QDebug>
    
    MainWindow::MainWindow(QWidget* parent)
      : QMainWindow(parent), manager(this) {
      load();
    }
    
    void MainWindow::load() {
      const QUrl url(QStringLiteral("http://httpbin.org/xml"));
    
      QNetworkReply* reply = manager.get(QNetworkRequest(url));
    
      connect(reply, &QNetworkReply::finished, this, [this, reply]() {
        replyFinished(reply);
      });
    
      qDebug() << reply->readAll(); // The reply won't be ready by now, so
                                    // testing here isn't very helpful.
    }
    
    void MainWindow::replyFinished(QNetworkReply* reply) {
      qDebug() << reply->readAll();
      reply->deleteLater();
    }
    

    MainWindow.hpp

    #ifndef MAINWINDOW_HPP
    #define MAINWINDOW_HPP
    
    #include <QMainWindow>
    #include <QNetworkAccessManager>
    #include <QNetworkReply>
    
    class MainWindow : public QMainWindow {
      Q_OBJECT
    
     public:
      explicit MainWindow(QWidget* parent = nullptr);
    
     public slots:
      void load();
      void replyFinished(QNetworkReply* reply);
    
     private:
      QNetworkAccessManager manager;
    };
    
    #endif // MAINWINDOW_HPP
    

    main.cpp

    #include "MainWindow.hpp"
    #include <QApplication>
    
    int main(int argc, char* argv[]) {
      QApplication a(argc, argv);
      MainWindow w;
      w.show();
    
      return a.exec();
    }
    

    network.pro

    QT += core gui widgets network
    
    TARGET = network
    TEMPLATE = app
    
    DEFINES += QT_DEPRECATED_WARNINGS
    
    CONFIG += c++11
    
    SOURCES += \
      main.cpp \
      MainWindow.cpp
    
    HEADERS += MainWindow.hpp
    

    【讨论】:

    • 我测试了你的解决方案,但没有用 :( 在 Qt 5.6 中。你能改进你的答案吗?谢谢 :)
    猜你喜欢
    • 2014-03-05
    • 1970-01-01
    • 2019-07-29
    • 2011-12-17
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2016-05-19
    相关资源
    最近更新 更多