概念
Qt中的HTTP编程主要涉及使用Qt的网络模块来进行HTTP请求和处理HTTP响应。Qt提供了一系列类来处理网络通信,其中最常用的类是 QNetworkAccessManager 、 QNetworkRequest 、 QNetworkReply 以及相关的支持类。
编程实例
以下是一个基本的HTTP编程示例,展示了如何使用Qt发送一个简单的HTTP GET请求并处理响应:
步骤 1: 包含必要的头文件
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QObject>
#include <QDebug>步骤 2: 发送HTTP请求
创建一个 QNetworkAccessManager 对象,并使用它发送HTTP请求。 QNetworkAccessManager 对象会
异步地处理请求,并返回一个 QNetworkReply 对象。
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QNetworkAccessManager manager;
QNetworkRequest request(QUrl("http://example.com"));
QNetworkReply *reply = manager.get(request);
QObject::connect(reply, &QNetworkReply::finished, [&]() {
if (reply->error()) {
qDebug() << "Error:" << reply->errorString();
return;
}
QString response = reply->readAll();
qDebug() << "Response:" << response;
});
return a.exec();
}
我们使用 QNetworkAccessManager 的 get 方法发送了一个HTTP GET请求到"http://exa
mple.com"。然后,我们连接了 QNetworkReply 对象的 finished 信号到一个lambda函数,该函数在收
到HTTP响应时被调用。
注:
进行http请求之前要先把 network 添加到pro文件中
获取天气信息的url:
http://t.weather.itboy.net/api/weather/city/101010100
初始化network对象
在 构造函数 中
//由QNetworkAccessManager 发起request请求://QNetworkRequest - 指定请求的url地址//QNetworkReply网络请求后进行数据读取
//由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();//404qDebug()<<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对象}
}
效果演示
状态码
服务器对请求的响应中包含一个状态码,它表示请求的成功或失败,以及失败的原因。常见的状态码包括:
200 OK: 请求成功。
404 Not Found: 请求的资源未找到。
500 Internal Server Error: 服务器内部错误。
301 Moved Permanently: 请求的资源已永久移动到新位置。