qt网络post请求错误QIODevice::read (QDisabledNetworkReply): device not open和Network access is disabled解决方法

16 篇文章 0 订阅

在做一个有关agv小车的项目,需要自编qt程序连接服务器获取数据,http请求类型为post,发送的数据类型为json。稍微在网上搜一下,就可以找到千变一律的代码,直接粘过来用就可以了。但调试了一下午,就是获取不了数据,而用postman调试却可以获得正常的数据,输出的错误如下所示:

Error warning:  "Network access is disabled."
QIODevice::read (QDisabledNetworkReply): device not open

在这里插入图片描述
看了qt的QNetworkReply官方文档、查遍了国内外网站也没查出个啥,直到最后在官网上看了QNetworkAccessManager的详解文档。唉,有点意思,和我的错误挺接近,粘过来试试,没想到成了。
在这里插入图片描述
总结,针对上述错误的解决方法就是在QNetworkAccessManager初始化后加入如下代码

net_mgr->setNetworkAccessible(QNetworkAccessManager::Accessible);

为了实现类似Python的post请求,我封装了一个如下的函数,可以直接返回想要获取的json数据:

QJsonObject WebTest::getJsonObject(QString url, QJsonObject object)
{
	QJsonDocument document = QJsonDocument(object);
	QByteArray post_data = document.toJson(QJsonDocument::Compact);

	//构造请求
	QNetworkRequest net_request;
	net_request.setUrl(QUrl(url));
	//请求头:其中 Content-Type 指定了客户端发送的内容格式。例如:Content-Type: application/json,指客户端发送的内容格式为 Json
	net_request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));//QVariant("application/json;charset=UTF-8")

	QNetworkAccessManager netManager(this);
	netManager.setNetworkAccessible(QNetworkAccessManager::Accessible);
	QNetworkReply * reply = netManager.post(net_request, post_data);

	QEventLoop eventLoop;
	connect(&netManager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit);
	eventLoop.exec();


	QByteArray bytes = reply->readAll();
	qDebug() << "Receive data:" << bytes;

	QJsonObject jsonObject = QJsonDocument::fromJson(bytes).object();
	reply->deleteLater();

	return jsonObject;
}

使用范例:

QString agvIP = "http://192.168.7.254/v1/mobile_platform_send";
QJsonObject object1;
object1.insert("token", token);
object1.insert("id", 1);

QJsonObject objectRecei = getJsonObject(agvIP, object1);
//然后从objectRecei中提取想要的数据 

最后附上postman的一张使用说明
在这里插入图片描述

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值