【Qt】HTTP请求和处理响应

        Qt提供了一个名为QNetworkAccessManager的类来处理HTTP请求,使用QNetworkAccessManager,可以发送HTTP请求并接收响应,以便程序与服务器进行通信。

Qt中处理HTTP请求和响应相关的类

1QNetworkAccessManager用于发送HTTP请求和接收响应的类。
2QNetworkRequest表示HTTP请求的类,可以设置请求URL、请求头等信息。
3QNetworkReply表示HTTP响应的类,可以读取响应的内容、错误处理等。
4QNetworkCookieJar用于管理HTTP请求和响应中的Cookie类。
5QNetworkCookie表示HTTP请求和响应中的Cookie的类。
6QNetworkProxy表示网络代理的类,可以设置代理服务器来处理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。这些类提供了丰富的接口,以上示例紧紧展示了很小的一部分,更多的方法需要自行探索。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Qt的多线程和网络请求的示例代码: ```cpp #include <QtCore> #include <QtNetwork> class HttpWorker : public QObject { Q_OBJECT public: HttpWorker(QObject *parent = nullptr) : QObject(parent) {} public slots: void request(const QString &urlString) { QUrl url(urlString); QNetworkAccessManager manager; QNetworkRequest request(url); QNetworkReply *reply = manager.get(request); connect(reply, &QNetworkReply::finished, this, [reply]() { QByteArray data = reply->readAll(); emit finished(data); reply->deleteLater(); }); } signals: void finished(const QByteArray &data); }; int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); HttpWorker worker; QThread thread; worker.moveToThread(&thread); thread.start(); QObject::connect(&worker, &HttpWorker::finished, &app, [&](const QByteArray &data) { qDebug() << data; QCoreApplication::quit(); }); QMetaObject::invokeMethod(&worker, "request", Qt::QueuedConnection, Q_ARG(QString, "https://www.example.com")); return app.exec(); } #include "main.moc" ``` 这个示例代码创建了一个`HttpWorker`类来处理网络请求。在`request`函数中,它接收一个URL字符串,使用`QNetworkAccessManager`发送GET请求,并在请求完成时发出`finished`信号。 在`main`函数中,我们创建了一个Qt线程和一个`HttpWorker`对象,并将其移到线程中。然后,我们连接`HttpWorker`的`finished`信号到`main`函数中的一个槽函数,并使用`QMetaObject::invokeMethod`函数在`HttpWorker`对象的线程上异步调用`request`函数。 当`HttpWorker`对象完成请求时,它将发出`finished`信号,该信号将由`main`函数中的槽函数处理。在此示例中,槽函数只是输出数据并退出应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值