admin管理员组文章数量:1640616
在做一个有关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的一张使用说明
版权声明:本文标题:qt网络post请求错误QIODevice::read (QDisabledNetworkReply): device not open和Network access is disabled解决方法 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1729319910a1195755.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论