Qt&&C++ 实现HTTP Get/Post请求 (笔记)

发布时间 2023-12-24 00:02:52作者: Bcaid

使用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的流程了,作为笔记保留着,如果文章中有问题可以在评论中指出,谢谢 !!!