需要在.pro项目文件中添加网络模块,不然无法使用http相关的类获取数据
QT += core gui network
用于http通信的类为QNetworkAccessManager
发送Get请求
通过调用QNetworkAccessManager::get方法
QNetworkReply *QNetworkAccessManager::get(const QNetworkRequest &request)
如何获得响应
每次发送http请求收到响应后QNetworkAccessManager都会发出1个finished信号:
[signal] void QNetworkAccessManager::finished(QNetworkReply *reply)
这个信号的参数就存储了http响应的信息
我们就可以定义一个槽函数来绑定这个信号,在槽函数中解析信号传过来的参数中携带的信息
举例
向天气网发送请求,获取北京的最近几天的天气数据,然后将请求到的数据打印到控制台
#include<QNetworkAccessManager>
#include<QNetworkReply>
#include<QNetworkRequest>
#include<QUrl>
//创建http请求管理类
QNetworkAccessManager* mgr=new QNetworkAccessManager(this);
//绑定槽函数
connect(mgr,&QNetworkAccessManager::finished,this,[=](QNetworkReply* reply){
//在这个槽函数中解析响应
//1.可以获取到这次请求的方法,是get还是post或其他
qDebug()<<"operation:"<<reply->operation();
//2.可以获取到这次响应的状态码,200=OK
qDebug()<<"status code:"<<
reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
//3.可以获取到这次请求时的url
qDebug()<<"url:"<<reply->url();
//4.可以或取到响应头
qDebug()<<"raw header:"<<reply->rawHeaderList();
//5.可以获取这次响应的错误码,请求成功则返回QNetworkReply::NoError
qDebug()<<reply->error();
if(reply->error()!=QNetworkReply::NoError
|| reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()!=200)
{
//请求失败直接返回
return;
}
//6.获取响应的json报文
//readAll方法
auto reply_info=reply->readAll();
qDebug()<<"json info:\n"<<reply_info.data();
//每次响应解析完成后记得释放内存
reply->deleteLater();
});
//发送请求
//请求需要url
QUrl url("http://t.weather.itboy.net/api/weather/city/101010100");
mgr->get(QNetworkRequest(url));
请求中如何加入JSON报文
QNetworkAccessManager * mgr = new QNetworkAccessManager(this);
QNetworkRequest request;
request.setUrl(QUrl("www.baidu.com"));
//指明内容是json报文
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
//组装json报文
//.......
QByteArray json;
//请求时将报文塞进去
mgr -> get(request, json);
请求后获取响应设置超时限制
QNetworkAccessManager * mgr = new QNetworkAccessManager(this);
QNetworkRequest request;
request.setUrl(QUrl("www.baidu.com"));
//指明内容是json报文
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
//组装json报文
QByteArray json;
//请求时将报文塞进去
QNetworkReply * reply = mgr -> get(request, json);
//添加超时处理
//使用eventloop在这里等待下
QEventLoop eventloop;
//提前响应完成,要提前退出事件循环
connect(reply, & QNetworkReply::finished, & eventloop, & QEventLoop::quit);
//使用定时器3ms后触发某个动作:3ms退出事件循环,如果在3ms后才退出循环,说明超时了,上面的提前退出没有触发
QTimer::singleShot(3, Qt::PreciseTimer, & eventloop, & QEventLoop::quit);
//循环等待
eventloop.exec();
if (reply -> isFinished()) {
//没有超时
} else {
//超时
}