Qt实现同步(阻塞式)http get等网络访问操作
Qt的网络操作类是异步(非阻塞的),但有时想做一些阻塞的事情就不方便了,可用如下几行代码轻松实现:
QByteArray MyNetworkAccess::get(const QString &strUrl)
{
assert(!strUrl.isEmpty()); const QUrl url = QUrl::fromUserInput(strUrl);
assert(url.isValid()); QNetworkRequest qnr(url);
QNetworkReply* reply = m_qnam.get(qnr); //m_qnam是QNetworkAccessManager对象 QEventLoop eventLoop;
connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
eventLoop.exec(QEventLoop::ExcludeUserInputEvents); QByteArray replyData = reply->readAll();
reply->deleteLater();
reply = nullptr; return replyData;
}
当然如上方式不支持重定向(301等),因为暂时用不上,如果要支持,还要在return前判断并循环或递归。
另外如果出现error,上述方式会把服务器返回的错误信息直接返回,支持判断错误的版本请继续往下看!
并且可以看出本来是封装了一个网络操作类,但现在只有get,post等还没做,等弄好了也一起放上来!
第二版——支持判断error和重定向(error和重定向均按错误处理):
QByteArray MyNetworkAccess::get(const QString &strUrl)
{
assert(!strUrl.isEmpty()); const QUrl url = QUrl::fromUserInput(strUrl);
assert(url.isValid()); QNetworkRequest qnr(url);
QNetworkReply* reply = m_qnam.get(qnr); //m_qnam是QNetworkAccessManager对象 QEventLoop eventLoop;
connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
eventLoop.exec(QEventLoop::ExcludeUserInputEvents); QByteArray replyData = reply->readAll();
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QVariant redirectAttr = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
if (reply->error()
|| == statusCode //状态码300 Multiple Choices,既不是错误也不算重定向,应该是qt bug
|| !redirectAttr.isNull())
{
QString errString = reply->error() ? reply->errorString() : QString("发生重定向(%1),不允许此情况").arg(statusCode);
QMessageBox::critical(nullptr, "网络异常",
QString("发送get请求时出现错误:\n网址:%1\n错误信息:%2").arg(reply->request().url().toDisplayString(), errString));
replyData.clear();
} reply->deleteLater();
reply = nullptr; return replyData;
}
Qt实现同步(阻塞式)http get等网络访问操作的更多相关文章
- 【Java】同步阻塞式(BIO)TCP通信
TCP BIO 背景 网络编程的基本模型是Clien/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接 ...
- java网络通信:同步阻塞式I/O模型(BIO)
缺点:一个线程只能处理一个客户端连接 服务端: public class TimeServer { public static void main(String[] args) throws IOEx ...
- Java IO(2)阻塞式输入输出(BIO)的字节流与字符流
在上文中<Java IO(1)基础知识——字节与字符>了解到了什么是字节和字符,主要是为了对Java IO中有关字节流和字符流有一个更好的了解. 本文所述的输出输出指的是Java中传统的I ...
- Java IO(2)阻塞式输入输出(BIO)
在上文中<Java IO(1)基础知识——字节与字符>了解到了什么是字节和字符,主要是为了对Java IO中有关字节流和字符流有一个更好的了解. 本文所述的输出输出指的是Java中传统的I ...
- IO同步阻塞与同步非阻塞
BIO.NIO.AIO IO(BIO)和NIO区别:其本质就是阻塞和非阻塞的区别 阻塞概念:应用程序在获取网络数据的时候,如果网络传输数据很慢,就会一直等待,直到传输完毕为止. 非阻塞概念:应用程序直 ...
- Qt 学习之路 2(68):访问网络(4)
Home / Qt 学习之路 2 / Qt 学习之路 2(68):访问网络(4) Qt 学习之路 2(68):访问网络(4) 豆子 2013年11月7日 Qt 学习之路 2 19条评论 前面几章我们了 ...
- Socket-IO 系列(三)基于 NIO 的同步非阻塞式编程
Socket-IO 系列(三)基于 NIO 的同步非阻塞式编程 缓冲区(Buffer) 用于存储数据 通道(Channel) 用于传输数据 多路复用器(Selector) 用于轮询 Channel 状 ...
- Java基础知识强化之多线程笔记07:同步、异步、阻塞式、非阻塞式 的联系与区别
1. 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就必须先得到返回值了. 换句话话说,调用者主动等待这个"调用"的结果. 对于 ...
- 阻塞式I/0 和 非阻塞式I/O 同步异步详细介绍
请求描述: `阻塞/非阻塞` 和 `同步/异步` 不是一个概念.举几个简单的例子. 当进程调用一个进行IO操作的API时(比如read函数),在数据没有到达前,read 会挂起,进程会卡住.在数据读取 ...
随机推荐
- 【OSX】build AOSP 2.3.7时的build error解决
原始的error log: ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VE ...
- Java:类的构造函数
类的构造函数 类的构造函数特点: 1. 构造函数也称为构造方法,构造函数名和类名相同. 2. 构造函数不能有返回值,也不能用void声明. 3. 构造函数可以有参数,也可以无参数,在一个类 ...
- 从零开始学 Web 之 移动Web(二)JD移动端网页,移动触屏事件
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- 由浅入深:CNN中卷积层与转置卷积层的关系
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由forrestlin发表于云+社区专栏 导语:转置卷积层(Transpose Convolution Layer)又称反卷积层或分数卷 ...
- Go命令行参数解析flag包
go语言提供的flag包可以解析命令行的参数,代码: package main import ( "flag" "fmt" ) func main() { // ...
- Rails/ActiveRecord order by Array
ActiveRecord中如果想根据自定义的一个数组id集合排序: ids = [2,1,3] users = User.where("id in (?)",ids) result ...
- Java设计模式学习记录-装饰模式
前言 装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度.JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一 ...
- Scala函数与函数式编程
函数是scala的重要组成部分, 本文将探讨scala中函数的应用. scala作为支持函数式编程的语言, scala可以将函数作为对象即所谓"函数是一等公民". 函数定义 sca ...
- 【Java】模拟Sping,实现其IOC和AOP核心(二)
接着上一篇,在上一篇完成了有关IOC的注解实现,这一篇用XML的方式实现IOC,并且完成AOP. 简易的IOC框图 注解的方式实现了左边的分支,那么就剩下右边的XML分支: XmlContext:这个 ...
- eclipse中安装windowbuilder插件、应用及卸载
一.安装windowbuilder插件 1.找到对应版本的windowbuilder 连接地址:http://www.eclipse.org/windowbuilder/download.php 如图 ...