QT网络编程http

3 篇文章 0 订阅

在本地生成 html 文件,双击打开进入网页,网上找的代码,记录一下

[1] MyHttp.pro 添加 network

# [1]添加 network
QT += network

[2] mainwindow.h 添加头文件

// [2] 添加头文件
#include <QDebug>
#include <QtNetwork>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QTextCodec>
#include <QFile>
#include <QTextStream>
#include <QDateTime>

[3] mainwindow.h 添加私有对象

// [3] 添加对象
private:
	QUrl url;
	QNetworkRequest req;
	QNetworkReply *reply;
	QNetworkAccessManager *manager;

[4] mainwindow.h 声明槽

// [4]声明槽
private slots:
    void startRequest(const QUrl &requestedUrl);
    void replyFinished();

[5] mainwindow.c

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // [5]发送http请求
    startRequest( QUrl("http://www.baidu.com"));
}

MainWindow::~MainWindow()
{
    delete ui;
}

// [6]发起HTTP请求
/*
 * 功能描述:发送HTTP请求,并与请求响应的槽绑定
 *  @param requestedUrl:请求需要的URL地址
*/
void MainWindow::startRequest(const QUrl &requestedUrl){
    url = requestedUrl;
    manager = new QNetworkAccessManager(this);
    req.setUrl(url);
    qDebug() << "setUrl ok";
    req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
    qDebug() << "setAttribute ok";
    req.setRawHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
    qDebug() << "setRawHeader ok";
    req.setRawHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36");
    qDebug() << "setRawHeader ok";
    reply = manager->get(req);
    qDebug() << "reply...";
    connect(reply,&QNetworkReply::finished,this,&MainWindow::replyFinished);
}

// [7]获取HTTP的请求响应
/*
 * 功能描述:HTTP请求后,接收服务器的请求信息
 * 1 检测请求响应是否有错误
 * 2 获取请求响应的状态码
 * 3 判断是否需要重定向
 *   - 不需要,则保存数据
 *   - 需要重定向,则获取重定向的URL,然后通过这个URL再次发起请求
*/
void MainWindow::replyFinished(){
    qDebug() << "replyFinished";
    // <1>判断有没有错误
    if (reply->error()){
        qDebug()<<"reply error:" << reply->errorString();
        reply->deleteLater();
        return;
    }

    // <2>检测状态码
    int statusCode  = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    qDebug() << "statusCode:" << statusCode;

    // <3>判断是否需要重定向
    if (statusCode >= 200 && statusCode <300){
        // ok

        // 准备读数据
        QTextCodec *codec = QTextCodec::codecForName("utf8");
        QString all = codec->toUnicode(reply->readAll());
        qDebug() << "codec to Unicode:" << all;


        // 保存HTTP响应内容
        // 组装保存的文件名 文件名格式: 路径/年_月_日 小时_分_秒 httpfile.html
        QDateTime current_date_time =QDateTime::currentDateTime();
        QString current_date =current_date_time.toString("yyyy_MM_dd hh_mm_ss");
        QString filePath = QApplication::applicationDirPath() + QStringLiteral("/httpDoc");
        QString fileName = filePath + '/' + current_date + " httpfile" + ".html";
        qDebug() << fileName;

        QFile file(fileName);
        if (!file.open(QIODevice::ReadWrite | QIODevice::Text)){
            qDebug() << "file open error!";
            return ;
        }
        QTextStream out(&file);
        out.setCodec("UTF-8");
        out<<all << endl;
        file.close();


        // 数据读取完成之后,清除reply
        reply->deleteLater();
        reply = nullptr;

    } else if (statusCode >=300 && statusCode <400){
        // redirect

        // 获取重定向信息
        const QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
        // 检测是否需要重定向,如果不需要则读数据
        if (!redirectionTarget.isNull()) {
            const QUrl redirectedUrl = url.resolved(redirectionTarget.toUrl());

            reply->deleteLater();
            reply = nullptr;

            startRequest(redirectedUrl);
            qDebug()<< "http redirect to " << redirectedUrl.toString();
            return;
        }
    }
}

编译运行提示错误

qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error

解决方法

D:\Qt\Qt5.9.4\Tools\QtCreator\bin 目录下的 libeay32.dll ssleay32.dll 复制到 D:\Qt\Qt5.9.4\5.9.4\msvc2015\bin 目录下,直接编译运行 OK

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt提供了QNetworkAccessManager类用于实现HTTP网络编程。通过QNetworkAccessManager,你可以发送HTTP请求并接收响应。 以下是一个简单的示例代码,演示了如何使用QNetworkAccessManager发送GET请求并接收响应: ```cpp #include <QtNetwork> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QNetworkAccessManager manager; QUrl url("http://www.example.com"); // 要发送请求的URL QNetworkRequest request(url); QNetworkReply* reply = manager.get(request); // 发送GET请求 QObject::connect(reply, &QNetworkReply::finished, [&]() { if (reply->error() == QNetworkReply::NoError) { QByteArray data = reply->readAll(); // 读取响应数据 qDebug() << data; } else { qDebug() << "Error: " << reply->errorString(); } app.quit(); }); return app.exec(); } ``` 在这个示例中,我们创建了一个QNetworkAccessManager对象,并通过QUrl设置要发送请求的URL。然后,我们使用QNetworkRequest将URL传递给QNetworkAccessManager的get()函数,以发送GET请求。通过连接QNetworkReply的finished信号,我们可以在请求完成后获取响应数据。 当请求完成时,我们检查QNetworkReply的error()函数以确定是否发生错误。如果没有错误发生,我们可以使用readAll()函数读取响应数据,并输出到控制台。否则,我们输出错误信息。 需要注意的是,由于网络请求是异步进行的,我们使用QCoreApplication的exec()函数来进入事件循环,以等待请求完成。在请求完成后,我们通过调用QCoreApplication的quit()函数来退出事件循环。 这只是一个简单的示例,你可以根据具体需求设置请求头、发送POST请求等。Qt的文档中有更详细的说明和示例代码,你可以参考官方文档来深入学习Qt网络编程

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值