通过网络访问接口实现HTTP通信
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QUrl>
#include <QFile>
#include <QDebug>
class QNetworkReply;
class QNetworkAccessManager;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void startRequest(QUrl url);
public slots:
void pushButtonClicked();
private:
Ui::MainWindow *ui;
QNetworkAccessManager *manager;
QNetworkReply *reply;
QUrl url;
QFile *file;
private slots:
void httpFinished();
void httpReadyRead();
void updateDataReadProgress(qint64, qint64);
};
#endif
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
manager = new QNetworkAccessManager(this);
ui->progressBar->hide();
connect(ui->pushButton, &QPushButton::clicked,
this, &MainWindow::pushButtonClicked);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::startRequest(QUrl url)
{
reply = manager->get(QNetworkRequest(url));
connect(reply, &QNetworkReply::readyRead,
this, &MainWindow::httpReadyRead);
connect(reply, &QNetworkReply::downloadProgress,
this, &MainWindow::updateDataReadProgress);
connect(reply, &QNetworkReply::finished,
this, &MainWindow::httpFinished);
}
void MainWindow::pushButtonClicked()
{
qDebug() << "pushButtonClicked";
url = ui->lineEdit->text().trimmed();
QFileInfo info(url.path());
QString filename = info.fileName();
if(filename.isEmpty()){
filename = "index.html";
}
file = new QFile(filename);
if(!file->open(QIODevice::WriteOnly)){
delete file;
file = 0;
return;
}
qDebug() << url;
startRequest(url);
ui->progressBar->setValue(0);
ui->progressBar->show();
}
void MainWindow::httpFinished()
{
ui->progressBar->hide();
if(file){
file->close();
delete file;
file = 0;
}
reply->deleteLater();
reply = 0;
}
void MainWindow::httpReadyRead()
{
if(file){
file->write(reply->readAll());
}
}
void MainWindow::updateDataReadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
ui->progressBar->setMaximum(bytesTotal);
ui->progressBar->setMinimum(bytesReceived);
}