- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 OpenEmbedded 项目的 Qt5 Embedded 层编写嵌入式 RESTful API 客户端。我希望我的客户端能够发送一个简单的异步请求来通知我的服务器正在发生的事情,另一种情况是我的客户端需要从服务器同步数据。
为此,我编写了两个函数,一个用于发送请求,另一个用于获取响应。所以如果我不关心响应,我只使用第一个。
为了能够使用第二个响应,我使用 QNetworkReply * 作为我类(class)的成员。为了让 QNetworkReply 保持事件状态,我还将 QNetworkAccessManager 设置为我类(class)的成员。
#include <QtNetwork>
class ApiClient : public QObject
{
Q_OBJECT
public:
ApiClient(QObject *parent = 0);
private:
QString host;
QString key;
quint32 replyTimeout;
QNetworkAccessManager manager;
QNetworkReply *reply;
void sendRequest(const QString &method, const QVariantMap ¶ms = QVariantMap());
QVariantMap getResponse() const;
};
apiclient.cpp 文件:
#include "apiclient.h"
ApiClient::ApiClient(QObject *parent) : QObject(parent)
{
}
void ApiClient::sendRequest(const QString &method, const QVariantMap ¶ms)
{
QUrl url(QString("%1/%2/").arg(host).arg(method));
QUrlQuery query;
query.addQueryItem("key", key);
if (!params.empty())
{
QMapIterator<QString, QVariant> it(params);
while (it.hasNext())
{
it.next();
query.addQueryItem(it.key(), it.value().toString());
}
}
url.setQuery(query);
qDebug() << "url: " << url.toString();
reply = manager.get(QNetworkRequest(url));
}
QVariantMap ApiClient::getResponse() const
{
if (!reply)
{
qFatal("No request sent!");
}
QTimer timer;
timer.setSingleShot(true);
QEventLoop loop;
connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
timer.start(replyTimeout);
loop.exec();
if (timer.isActive())
{
timer.stop();
if (reply->error())
{
qFatal("Wrong reply!");
}
int code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (code != 200)
{
qFatal("Invalid server response!");
}
QJsonDocument result = QJsonDocument::fromJson(reply->readAll());
if (result.isNull())
{
qFatal("Invalid JSON!");
}
reply->deleteLater();
return result.object().toVariantMap();
}
disconnect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
reply->abort();
reply->deleteLater();
return QVariantMap();
}
这是继续进行的好方法吗?当发出其他信号(即 error()、sslErrors() 等)时,我应该如何管理 QNetworkReply 指针?
最佳答案
QNetworkReply
将始终发出 finished()
,即使发生错误也是如此。
deleteLater()
甚至可以在连接到该信号的插槽中调用,因此该部分应该没问题。
但我建议研究一种更异步的处理请求的方法,嵌套事件循环,如 getResponse()
中的 on 可以导致“有趣”的行为,因为您基本上可以得到进入单线程程序中的重入情况。
关于c++ - 删除 QNetworkReply 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40803530/
我阅读了信号完成()的文档,它没有说完成()总是发出。我读取了 error() 信号: void QNetworkReply::error(QNetworkReply::NetworkError co
我正在使用 Qt 4.6.3 和以下不起作用的代码 QStringList userInfo; QNetworkRequest netRequest(QUrl("http://api.stackove
我希望能够将 QNetworkReply 保存到 QString/QByteArray。在我看到的示例中,它们总是将流保存到另一个文件。 目前我的代码看起来像这样,我从主机那里得到一个字符串,我想做的
我是 C++ 和 Qt 的新手,所以我很自然地遇到了麻烦。我正在尝试创建一个独立于连接到 URL 并接收 JSON 响应的 MainWindow 的类。但是,使用QObject::connect后,程
我有一个 QWebView我正在通过连接观看网络请求: QObject::connect(page()->networkAccessManager(),
我正在用 Qt 编写一个类,用于从 Bricklink API(一个乐高数据库)中检索信息。它使用 QOAuth1 类进行身份验证,并使用 QNetworkReply 捕获来自 HTTP GET 请求
假设我已经执行了一个 QNetworkRequest 并获得了适当的 QNetworkReply。如果它是一个大文件(比如 1 GB),我如何创建一个 4k 字节数组缓冲区并将数据 4k x 4k 读
我有一个与 QT 相关的问题。 QNetworkAccessManager::get() 返回 QNetworkReply 指针。然后我可以连接到它的完成插槽: QNetworkReply* r =
我可以在 Qt 中使用 QNetworkReply、QNetworkAccessManager、QNetworkRequest 等将文件发布到服务器。该服务器转换文件并将其吐回。我如何获得那个吐出来的
我的应用程序使用 QNetworkReply 从 RESTful API 发送和接收数据。 有许多教程可用于使用 QNetworkReply与 QNetworkAccessManager 一旦找到我使
这个问题在这里已经有了答案: Member access into incomplete type error (3 个答案) 关闭 4 年前。 我正在通过 QNetwork 访问管理器发出一个简单
我将使用 QNetworkAccessManager 通过我的移动应用向服务器发出对 HTTP 服务器的请求。问题是,如何将自定义数据链接到每个请求?我尝试子类化 QNetworkReply 但我发现
我正在尝试通过网络服务捕获一些数据,但遇到了以下问题。通过获取包含特殊字符(“Español”)的字符串,获取的文本不正确(“Espa\u00f1ol”)。 我尝试使用 wireshark 验证数据到
我正在使用 OpenEmbedded 项目的 Qt5 Embedded 层编写嵌入式 RESTful API 客户端。我希望我的客户端能够发送一个简单的异步请求来通知我的服务器正在发生的事情,另一种情
我正在尝试使用 QNetworkManager 上传一些数据并在 QNetworkReply 中获得响应。然后我测试,如果回复是一个错误,如果,我打印错误消息,我不明白结果。 if(reply->er
是一种HTTP请求发送方式。当目标网站响应时,将调用 httpFinished()。 void HTTPClientBase:: HttpRequestGet() { QNetworkRequ
我尝试在 C++ 中对 url https://... 执行 post 方法,但我收到连接关闭错误。 如果我使用另一个 url,比如 https://www.google.gr,我发现我的代码可以工作
是一种HTTP请求发送方式。当目标网站响应时,将调用 httpFinished()。 void HTTPClientBase:: HttpRequestGet() { network_mana
我有以下代码: connect(&netMgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(loadFinished(QNetworkReply*)),
如何在 QWebPage 之前从特定 URL 的 QNetworkReply 响应中读取数据?但是当finished()发出信号 QWebPage 已读取回复,因此连接 readyRead()或调用
我是一名优秀的程序员,十分优秀!