需要在.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));