qt4 convert QNetworkReply::NetworkError to QString
发布日期:2021-06-30 22:01:31
浏览次数:3
分类:技术文章
本文共 3374 字,大约阅读时间需要 11 分钟。
前言
要在线程中执行http post get 操作,url是配置文件中,由用户设定的。
执行http url 操作后, 需要判断是否执行成功. 如果url无效,那一定不成功。 想通过错误码来判断,并将错误码转成字符串。 找了下,网上同学的例子,都是针对QT5的。 我从QT4.7的demo工程中,找到了如何将QNetworkReply::NetworkError转成字符串试验
刚整了一个http get操作的测试函数,在里面试验,在失败的情况下,将错误码转串,好使。
void WorkerThread3::http_get1(){ QTimer timer; // 如果不设置超时, 一个无效的url访问执行后,要默认30秒才返回,这时,会带一个错误码 // // 如果设置超时时间T小于30秒,无效url访问后,在T秒后就会返回,这时错误码还是QNetworkReply::NoError // 需要判断返回内容是否为空,是否为有效内容来判断是否执行url成功了 // 如果在局域网内执行一个有效的url, 3秒钟足够返回数据了 timer.setInterval(3000); // 设置超时时间, 这个时间不能设置短了,设置的太短,发生了错误,错误码也没设置成真正的错误码 timer.setSingleShot(true); // 单次触发 // 因为是在线程中实现的http操作,所以阻塞执行就行了, 逻辑简单 QString str_tmp; QString str_url; QNetworkReply::NetworkError err; QNetworkAccessManager *accessManager = new QNetworkAccessManager(this); QNetworkRequest request; // Post和Get都是用于向服务器发送请求的,两者都可以带参数,只不过方式不同 // 不同之处: // Get将参数直接与网址整合为一个整体 // Post则将其拆为两个部分,一部分是网址,另一个部分才是参数,并且必须为其设置报文setHeader,否则服务器是无法找到参数的。 str_url = QString(tr("http://%1")).arg(/*"www.baidu.com"*/ this->m_str_url); request.setUrl(QUrl(str_url)); //get QNetworkReply* rplay = accessManager->get(request); QEventLoop eventLoop; connect(&timer, SIGNAL(timeout()), &eventLoop, SLOT(quit())); // 如果不想设置超时, 注释掉这行 connect(accessManager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit())); timer.start(); eventLoop.exec(); //block until finish timer.stop(); do { err = rplay->error(); // test - get special err sn's string str_tmp = QString(tr("network error : [%1] %2")).arg(err).arg(get_network_err_string(QNetworkReply::RemoteHostClosedError)); // "network error : [0] RemoteHostClosedError" if (QNetworkReply::NoError != err) { // 只有不设置超时,等accessManager完成后,才会带真正的错误码回来 str_tmp = QString(tr("network error : [%1] %2")).arg(err).arg(get_network_err_string(err)); // "network error : [99] UnknownNetworkError" show_ui_msg(str_tmp); return; } QByteArray rd_buf = rplay->readAll(); str_tmp.clear(); // 如果accessManager没有正常完成,错误码还是QNetworkReply::NoError // 所以要判断一下回包 if (rd_buf.length() <= 0) { str_tmp = QString(tr("error : http get [%1]").arg(request.url().toString())); show_ui_msg(str_tmp); return; } // use recv package str_tmp.append(rd_buf); show_ui_msg(str_tmp); // now only show it } while (0); if (NULL != accessManager) { delete accessManager; accessManager = NULL; }}QString WorkerThread3::get_network_err_string(QNetworkReply::NetworkError err_sn){ const QMetaObject &mo = QNetworkReply::staticMetaObject; QMetaEnum metaEnum = mo.enumerator(mo.indexOfEnumerator("NetworkError")); return metaEnum.valueToKey(err_sn);}
整了一个公用头文件,在每个类的头文件中包含上,这样就不用到处增补QT系统的头文件了。
// @file common_header.h// @brief all the QT system header file used on project// please include common_header.h on every class header#ifndef COMMON_HEADER_H#define COMMON_HEADER_H// ui#include#include #include #include #include // core#include // text#include #include // data#include #include #include // file#include #include // thread#include #include // network#include #include #include #include #include #endif // COMMON_HEADER_H
转载地址:https://lostspeed.blog.csdn.net/article/details/100182484 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月30日 15时55分49秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Python读取配置文件中文乱码问题
2019-05-01
使用Spark读写外部存储介质(Mysql、Hbase、Redis)
2019-05-01
Spark学习——利用Mleap部署spark pipeline模型
2019-05-01
手写LogisticRegression
2019-05-01
SQL经典题目总结
2019-05-01
剑指offer编程题,一周刷完
2019-05-01
推荐系统初学
2019-05-01
Map的遍历和排序
2019-05-01
约瑟夫环问题
2019-05-01
springboot+log4j2体验
2019-05-01
redis集群启动方式
2019-05-01
ubuntu系统开机自启动方式
2019-05-01
ES查询效率之快的三个重要技术
2019-05-01
JDBC概念,JDBC连接到Oracle 11g(内附驱动jar包),
2019-05-01
彻底卸载MySQL
2019-05-01
Oracle创建表,修改表(添加列、修改列、删除列、修改表的名称以及修改列名)
2019-05-01
SQL命令分类(DDL、DML、DCL、TCL以及事务)
2019-05-01
nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate 报错
2019-05-01
kafka集群搭建
2019-05-01
Python正则表达式,从入门到实战,精华都在这里!
2019-05-01