2

我有一个带有以下 URL 的简单 Web 服务:

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

2 回答 2

2

我已经包含了一个应该适合您的示例(强制同步请求 <-> 回复交换以简化调试过程):

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本身。

于 2014-08-23T15:42:00.640 回答
0

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

主窗口.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();
}

主窗口.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

主文件

#include "MainWindow.hpp"
#include <QApplication>

int main(int argc, char* argv[]) {
  QApplication a(argc, argv);
  MainWindow w;
  w.show();

  return a.exec();
}

网络专业版

QT += core gui widgets network

TARGET = network
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

CONFIG += c++11

SOURCES += \
  main.cpp \
  MainWindow.cpp

HEADERS += MainWindow.hpp
于 2014-08-23T15:50:53.727 回答