You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:39:16