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等网络访问操作的更多相关文章

  1. 【Java】同步阻塞式(BIO)TCP通信

    TCP BIO 背景 网络编程的基本模型是Clien/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接 ...

  2. java网络通信:同步阻塞式I/O模型(BIO)

    缺点:一个线程只能处理一个客户端连接 服务端: public class TimeServer { public static void main(String[] args) throws IOEx ...

  3. Java IO(2)阻塞式输入输出(BIO)的字节流与字符流

    在上文中<Java IO(1)基础知识——字节与字符>了解到了什么是字节和字符,主要是为了对Java IO中有关字节流和字符流有一个更好的了解. 本文所述的输出输出指的是Java中传统的I ...

  4. Java IO(2)阻塞式输入输出(BIO)

    在上文中<Java IO(1)基础知识——字节与字符>了解到了什么是字节和字符,主要是为了对Java IO中有关字节流和字符流有一个更好的了解. 本文所述的输出输出指的是Java中传统的I ...

  5. IO同步阻塞与同步非阻塞

    BIO.NIO.AIO IO(BIO)和NIO区别:其本质就是阻塞和非阻塞的区别 阻塞概念:应用程序在获取网络数据的时候,如果网络传输数据很慢,就会一直等待,直到传输完毕为止. 非阻塞概念:应用程序直 ...

  6. Qt 学习之路 2(68):访问网络(4)

    Home / Qt 学习之路 2 / Qt 学习之路 2(68):访问网络(4) Qt 学习之路 2(68):访问网络(4) 豆子 2013年11月7日 Qt 学习之路 2 19条评论 前面几章我们了 ...

  7. Socket-IO 系列(三)基于 NIO 的同步非阻塞式编程

    Socket-IO 系列(三)基于 NIO 的同步非阻塞式编程 缓冲区(Buffer) 用于存储数据 通道(Channel) 用于传输数据 多路复用器(Selector) 用于轮询 Channel 状 ...

  8. Java基础知识强化之多线程笔记07:同步、异步、阻塞式、非阻塞式 的联系与区别

    1. 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就必须先得到返回值了. 换句话话说,调用者主动等待这个"调用"的结果. 对于 ...

  9. 阻塞式I/0 和 非阻塞式I/O 同步异步详细介绍

    请求描述: `阻塞/非阻塞` 和 `同步/异步` 不是一个概念.举几个简单的例子. 当进程调用一个进行IO操作的API时(比如read函数),在数据没有到达前,read 会挂起,进程会卡住.在数据读取 ...

随机推荐

  1. linux下配置nginx反向代理例子

    官方说明: 例子: 虚拟机ip:192.168.85.3,物理机VMware Network Adapter VMnet8  ip:192.168.85.1 1,准备tomcat 准备一tomcat, ...

  2. .net core + headless chrome实现动态网页爬虫

    一般的http请求库只能够抓取到网页的静态内容,如果想抓取通过js动态生成的内容可以使用没有gui的browser库,之前许多人会使用phantomjs作为headless browser,不过现在p ...

  3. SpringMVC教程2

    接上篇文章-SpringMVC教程1 五.基本操作 1.响应请求的方式 1.1ModeAndView /** * 查询方法 * @return */ @RequestMapping("/qu ...

  4. C# ListView解读

    一.ListView类 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLines:设 ...

  5. Linux进程间通信(System V) --- 信号量

    信号量 IPC 原理 信号量通信机制主要用来实现进程间同步,避免并发访问共享资源.信号量可以标识系统可用资源的个数.最简单的信号量为二元信号量 下图为 Linux 信号量通信机制的概念图.在实际应用中 ...

  6. python集合操作和内置方法

    一 集合基本介绍 集合:在{}内用逗号隔开每个值,集合的特点: 每个值必须是不可变类型 集合是无序的 集合的值不能重复 集合的应用场景较少,最重要的应用场景为进行关系运算以及去重. 二 集合的操作 1 ...

  7. 深入浅出 JVM GC(2)

    # 前言 在 深入浅出 JVM GC(1) 中,限于上篇文章的篇幅,我们留下了一个问题 : 如何回收? 这篇文章将重点讲述这个问题. 在上篇文章中,我们也列出了一些大纲,今天我们就按照那个大纲来逐个讲 ...

  8. c# 导出表格 api

    Exportxian() { var url = "/api/Ema_bilingBill/ExportXianDeclaration"; const params = {}; v ...

  9. Oracle em 此网站的安全证书存在问题

    https://www.cnblogs.com/hyz5525/p/4390252.html C:\>emctl status dbconsole Oracle Enterprise Manag ...

  10. MVC 【Razor 视图引擎】基础操作 --页面跳转,传值,表单提交

    ASPX  与  Razor  仅仅是视图不一样. 新建项目----ASP.NET MVC 4 Web 应用程序------选择模板(空).视图引擎(Razor ) 1.视图中 c# 代码  与 HT ...