QT QNetworkAccessManager请求JSON返回空字节数组问题咨询
问题背景
以下代码用于从NGROK链接获取JSON文件,该链接指向存储JSON文件的游戏文件目录列表:
头文件代码:
//header file #ifndef CLIENT_H #define CLIENT_H #include <QWidget> #include <QtNetwork> #include <QFile> #include "board.h" class Client : public QObject { public: void startRequest(); void processRequest(); private: Board b; QNetworkAccessManager *manager = new QNetworkAccessManager(this); }; #endif // CLIENT_H
实现文件代码:
//cpp file #include "client.h" #include "board.h" //go to the NGROK url and retrieve the json file containing the game data void Client::startRequest() { QUrl json = QUrl::fromUserInput("URL goes here"); QNetworkRequest request; request.setUrl(json); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); QNetworkReply *reply = manager->get(request); connect(reply, &QNetworkReply::finished, this, &Client::processRequest); } //retrieve the data from the json file void Client::processRequest() { QNetworkRequest request; QJsonObject data; QNetworkReply *reply = manager->post(request, QJsonDocument(data).toJson()); if(reply->error() == QNetworkReply::NoError) { QByteArray response = reply->readAll(); qDebug() << response; QJsonDocument doc = QJsonDocument::fromJson(response); QJsonObject data = doc.object(); } else { qDebug() << "File failed to load --" << reply->errorString(); manager->clearAccessCache(); } reply->deleteLater(); }
代码运行无报错,但qDebug()输出为空字节数组,最终解析得到的QJsonDocument、QJsonObject对象均为空。
问题原因
核心错误在processRequest槽函数的响应对象获取逻辑:
- 你没有读取之前GET请求返回的响应,反而在槽函数里新建了一个无效的POST请求,读取这个无效请求的返回结果自然是空的。
startRequest()里调用manager->get()返回的QNetworkReply才是对应NGROK地址请求的响应对象,槽函数触发时需要通过sender()获取这个对象,而不是重新调用post()方法新建请求。 - 你新建的POST请求没有设置目标URL,本身就是无效请求,就算不抛出错误,也不可能返回你需要的JSON数据。
- 额外冗余问题:GET请求没有请求体,不需要设置
ContentTypeHeader为application/json,该头是用于标注请求体内容类型的,放在GET请求中无意义,部分服务端可能会因此返回异常响应。
修正后的processRequest实现
void Client::processRequest() { // 获取触发finished信号的对应GET请求响应对象 QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); if (!reply) return; if(reply->error() == QNetworkReply::NoError) { QByteArray response = reply->readAll(); qDebug() << response; QJsonParseError parseErr; QJsonDocument doc = QJsonDocument::fromJson(response, &parseErr); if (parseErr.error == QJsonParseError::NoError) { QJsonObject data = doc.object(); // 写入后续JSON数据处理逻辑 } else { qDebug() << "JSON解析失败:" << parseErr.errorString(); } } else { qDebug() << "File failed to load --" << reply->errorString(); manager->clearAccessCache(); } reply->deleteLater(); }
内容的提问来源于stack exchange,提问作者Ivan Bozhilov
相关产品推荐
相关产品推荐

