Qt提供了一个名为QNetworkAccessManager的类来处理HTTP请求,使用QNetworkAccessManager,可以发送HTTP请求并接收响应,以便程序与服务器进行通信。
Qt中处理HTTP请求和响应相关的类
1 | QNetworkAccessManager | 用于发送HTTP请求和接收响应的类。 |
2 | QNetworkRequest | 表示HTTP请求的类,可以设置请求URL、请求头等信息。 |
3 | QNetworkReply | 表示HTTP响应的类,可以读取响应的内容、错误处理等。 |
4 | QNetworkCookieJar | 用于管理HTTP请求和响应中的Cookie类。 |
5 | QNetworkCookie | 表示HTTP请求和响应中的Cookie的类。 |
6 | QNetworkProxy | 表示网络代理的类,可以设置代理服务器来处理HTTP请求和响应。 |
需要在项目文件中加入:qt+= network
使用案例
简单的案例
头文件:
#ifndef HTTPTEST_H
#define HTTPTEST_H
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkCookieJar>
#include <QtNetwork/QNetworkCookie>
class httptest:public QObject{
Q_OBJECT
public:
httptest();
void requestBaiduTest();
void requestCSDNTest();
private slots:
void replyFinishedSlot(QNetworkReply*);
private:
void replyBaiduTest(QNetworkReply*);
void replyCSDNTest(QNetworkReply*);
private:
QNetworkAccessManager _accessManager;
private:
const QUrl baidu=QUrl("https://www.baidu.com");
const QUrl csdn=QUrl("https://www.csdn.net");
};
#endif // HTTPTEST_H
源文件:
#include "httptest.h"
httptest::httptest():QObject(){
connect(&_accessManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinishedSlot(QNetworkReply*)));
requestBaiduTest();
requestCSDNTest();
}
void httptest::requestBaiduTest(){
QNetworkRequest request;
request.setUrl(baidu);
QNetworkReply* reply=_accessManager.get(request);
qDebug()<<reply;
}
void httptest::requestCSDNTest(){
QNetworkRequest request;
request.setUrl(csdn);
_accessManager.get(request);
}
void httptest::replyFinishedSlot(QNetworkReply* reply){
//根据不同的URL分开处理
if(reply->url()==baidu){
replyBaiduTest(reply);
}else if(reply->url()==csdn){
replyCSDNTest(reply);
}
reply->deleteLater();//需要手动释放
}
void httptest::replyBaiduTest(QNetworkReply* reply){
qDebug()<<reply;
// qDebug()<<reply->error();//错误
// qDebug()<<reply->readAll();//读取数据
}
void httptest::replyCSDNTest(QNetworkReply* reply){
Q_UNUSED(reply);
}
运行结果:
QNetworkReplyHttpImpl(0x20736b7a440)
QNetworkReplyHttpImpl(0x20736b7a440)
可以看到QNetworkReply* reply=_accessManager.get(request);与QNetworkAccessManager发出的信号finished(QNetworkReply*)中的QNetworkReply是同一个指针。
注意:
需要手动删除QNetworkReply对象。QNetworkReply是Qt中用于表示HTTP响应的类,当你发送一个HTTP请求后,会返回一个对应的QNetworkReply对象,用于接收服务器返回的数据。
根据Qt官方文档的说明,你需要负责管理QNetworkReply对象的生命周期,并在使用完毕后手动释放它。
或者可以给QNetworkReply设置一个适当的父对象,这样在父对象销毁时也会一并销毁它。
QHttpMultPart使用
QHttpMultPart用于在HTTP请求中处理多部分数据。它可以用于创建包含多个部分的HTTP请求,每个部分可以包含不同类型的数据,例如文本、文件或二进制数据。
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
// 添加文本部分
QHttpPart textPart;
textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"text\""));
textPart.setBody("Hello, World!");
multiPart->append(textPart);
// 添加文件部分
QHttpPart filePart;
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\"example.txt\""));
QFile *file = new QFile("path/to/example.txt");
file->open(QIODevice::ReadOnly);
filePart.setBodyDevice(file);
file->setParent(multiPart); // 保证文件在multiPart销毁时被删除
multiPart->append(filePart);
QNetworkRequest request(QUrl("http://example.com/upload"));
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkReply *reply = manager->post(request, multiPart);
multiPart->setParent(reply); // 保证multiPart在reply销毁时被删除
// 处理reply的响应 记得手动释放QNetworkReply对象
.....
QNetworkAccessManager 不仅有 get、post方法,还有put等方法,QNetworkRequest也可以设置请求头,QNetworkReply中也可以获取触发它的QNetworkRequest。这些类提供了丰富的接口,以上示例紧紧展示了很小的一部分,更多的方法需要自行探索。