Qt&&C++ 实现HTTP Get/Post请求 (笔记)
使用Qt实现Http Get/Post请求
由于最近需要用c++来发送get/post请求,我稍微学习了一下qt相关的函数,作为笔记.
"材料"准备:
(网络相关)
#include <QUrl>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
(用于同步get/post)
#include <QTimer>
#include <QEventLoop>
操作流程:
1. 实例化一个QNetworkAccessManager对象
QNetworkAccessManager netManager;
2. 用QNetworkRequest对象构建请求(在这一步设置网址、请求头之类的)
QNetworkRequest request;
request.setUrl(url);
3. 发送请求,并用一个QNetworkReply*类型的指针接收
QNetworkReply* reply = netManager.get(request);
或者
QNetworkReply* reply = netManager.post(request,data); //这里的data是post请求体
获取响应
(接下来以get为例, 因为get和post同理,只是get调用get函数,而post调用post函数并且多传个参罢了)
注意,这块QT是默认异步的,如果netManager对象接收到服务器返回的信息到会自动发送 &QNetworkAccessManager::finished 信号
所以我们可以这样输出返回信息
connect(netManager,&QNetworkAccessManager::finished,this,[=](){
QByteArray bytes = netReply->readAll();
qDebug() << bytes;
})
如果我们想要代码是同步的话,可以考虑使用 EventLoop 对象来堵塞
于是,我们可以这样开启一个局部的事件循环,等待得到响应后退出消息循环,最后输出响应信息:
//开启事件循环
QEventLoop eventLoop;
QObject::connect(netManager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit);
eventLoop.exec();
//获取响应信息并输出
QByteArray bytes = reply->readAll();
qDebug() << bytes;
超时处理
对于响应超时,我这里列出简单的解决方法:(QTimer派上用场了)
这里我们有 int timeout = 1000*10;//表示超时时限是10*1000毫秒,即10s
1.同步get/post的超时处理:
首先在eventLoop.exec();
之前加上QTimer::singleShot(timeout, &eventLoop, &QEventLoop::quit);
这一行代码
代码的作用是在10s后结束消息循环
然后在下面把获取响应信息的代码改为
if(reply->isFinished()){//如果reply获取了响应
//获取响应信息并输出
QByteArray bytes = reply->readAll();
qDebug() << bytes;
}else{//超时
qDebug() << "time out!!!";
}
2.异步 get/post的超时处理:
和同步的处理类似,直接在get/post请求函数(QNetworkReply* reply = netManager.get(request);//就是你发送请求的代码后面同步操作可,不需要到异步操作的另一个函数里面操作
)后面写上,但是异步我们是没有加eventloop的,所以我们在异步这里稍作修改(这里其实处理超时情况就可以了,在其他地方处理获取响应的信息):
QTimer::singleShot(timeout, this, [=](){
if(reply->isFinished()){//获取到了响应
//这里就不写什么了,因为获取响应后发出了信息,你在其他槽函数里面处理即可
}else{//超时
qDebug() << "time out!!!";
}
});
那么,这就是初步使用qt实现get/post的流程了,作为笔记保留着,如果文章中有问题可以在评论中指出,谢谢 !!!
本文作者:Bcaid
本文链接:https://www.cnblogs.com/bcaid/p/qtnetwork_http_get_post.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步