概念
Qt中的HTTP编程主要涉及使用Qt的网络模块来进行HTTP请求和处理HTTP响应。Qt提供了一系列类来处理网络通信,其中最常用的类是 QNetworkAccessManager 、 QNetworkRequest 、 QNetworkReply 以及相关的支持类。
编程实例
以下是一个基本的HTTP编程示例,展示了如何使用Qt发送一个简单的HTTP GET请求并处理响应:
我们使用 QNetworkAccessManager 的 get 方法发送了一个HTTP GET请求到"http://exa
mple.com"。然后,我们连接了 QNetworkReply 对象的 finished 信号到一个lambda函数,该函数在收
到HTTP响应时被调用。
注:
进行http请求之前要先把 network 添加到pro文件中
获取天气信息的url:
初始化network对象
在 构造函数 中
//由QNetworkAccessManager 发起request请求:
//实例化network对象
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, &QNetworkAccessManager::finished,[](){
qDebug()<<"manager Finnish!";
});
QUrl urlItBoy("http://t.weather.itboy.net/api/weather/city/101010100");
//QNetworkRequest - 指定请求的url地址
QNetworkRequest res(urlItBoy); //根据网址实例化QUrl对象,再根据这个对象实例化QNetworkRequest对象
reply = manager->get(res);
//网络请求后进行信号读取
connect(reply,&QNetworkReply::finished,this,&Widget::readHttpReply);
http网络请求后进行读取槽函数
//http网络请求后进行读取槽函数
void Widget::readHttpReply()
{
//大多数服务器网址返回的编码格式是 utf-8,需要进行格式转化
QByteArray data = reply->readAll();
qDebug()<<QString::fromUtf8(data); // 将读到utf-8格式的数据转为QString类型进行输出
}
效果演示
如下图,我们通过http编程获取到网页上的数据了
http请求失败错误处理
修改槽函数,添加错误处理
//http网络请求后进行读取槽函数
void Widget::readHttpReply()
{
int resCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();//404
qDebug()<<resCode;
if(reply->error() == QNetworkReply::NoError && resCode == 200){ // 没出错的情况下执行
//大多数服务器网址返回的编码格式是 utf-8,需要进行格式转化
QByteArray data = reply->readAll();
qDebug()<<QString::fromUtf8(data); // 将读到utf-8格式的数据转为QString类型进行输出
}
else{
//qDebug()<<"请求失败"<<reply->errorString();
QMessageBox msg;
msg.setWindowTitle("错误");
msg.setText("网络请求失败!");
msg.setStyleSheet("QPushButton{color:red};");//设置按钮样式
msg.setStandardButtons(QMessageBox::Ok); //添加Ok按钮
msg.exec();// 调用QMessageBox对象
}
}