Qt实现同步(阻塞式)http get等网络访问操作

Posted 骑单车的攻城狮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt实现同步(阻塞式)http get等网络访问操作相关的知识,希望对你有一定的参考价值。

Qt的网络操作类是异步(非阻塞的),但有时想做一些阻塞的事情就不方便了,可用如下几行代码轻松实现:

 1 QByteArray MyNetworkAccess::get(const QString &strUrl)
 2 {
 3     assert(!strUrl.isEmpty());
 4 
 5     const QUrl url = QUrl::fromUserInput(strUrl);
 6     assert(url.isValid());
 7 
 8     QNetworkRequest qnr(url);
 9     QNetworkReply* reply = m_qnam.get(qnr); //m_qnam是QNetworkAccessManager对象
10 
11     QEventLoop eventLoop;
12     connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
13     eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
14 
15     return reply->readAll();
16 }

 

当然如上方式不支持重定向(301等),因为暂时用不上,如果要支持,还要在return前判断并循环或递归。

另外如果出现error,现在的方式会把服务器返回的错误信息直接返回,后面再更新一版,支持判断错误的,敬请期待!

并且可以看出本来是封装了一个网络操作类,但现在只有get,post等还没做,等弄好了也一起放上来!

 

以上是关于Qt实现同步(阻塞式)http get等网络访问操作的主要内容,如果未能解决你的问题,请参考以下文章

Qt设置阻塞式网络请求,和超时处理

网络IO模型对比(BIONIOAIO)

关于网络IO中的同步异步阻塞非阻塞

关于网络IO中的同步异步阻塞非阻塞

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

阻塞式/非阻塞式与同步/异步的区别