相关QT Class
运行结果
相关源码
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUrl>
#include <QJsonDocument>
#include <QFile>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
void startRequest(const QUrl &requestedUrl, const QJsonDocument& json);
private slots:
void on_postButton_clicked();
void requestFinished();
private:
Ui::MainWindow *ui;
QUrl m_url;
QNetworkAccessManager m_nam;
QJsonDocument m_json;
QNetworkReply *m_reply;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QJsonObject>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowIcon(QIcon(":/bee.ico"));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::startRequest(const QUrl &requestedUrl, const QJsonDocument& json)
{
m_url = requestedUrl;
QNetworkRequest request(m_url);
if(!json.isNull())
{
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
m_reply = m_nam.post(request, json.toJson());
}
else
{
m_reply = m_nam.get(request);
}
connect(m_reply, &QNetworkReply::finished, this, &MainWindow::requestFinished);
}
void MainWindow::on_postButton_clicked()
{
QString urlSpec = ui->urlEdit->text().trimmed();
QUrl newUrl = QUrl::fromUserInput(urlSpec);
if (!newUrl.isValid())
{
QMessageBox::critical(this, tr("Error"), tr("Invalid URL: %1: %2").arg(urlSpec, newUrl.errorString()));
return;
}
QString text = ui->requestEdit->toPlainText();
if(text.isEmpty())
{
m_json = QJsonDocument();
}
else
{
m_json = QJsonDocument::fromJson(text.toUtf8());
if(m_json.isNull())
{
QMessageBox::critical(this, tr("Error"), tr("Invalid json format."));
return;
}
}
startRequest(newUrl, m_json);
}
void MainWindow::requestFinished()
{
if (m_reply->error())
{
QMessageBox::critical(this, tr("Error"), tr("Request failed: %1:").arg(m_reply->errorString()));
m_reply->deleteLater();
m_reply = nullptr;
return;
}
const QVariant redirectionTarget = m_reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
m_reply->deleteLater();
if (!redirectionTarget.isNull())
{
const QUrl redirectedUrl = m_url.resolved(redirectionTarget.toUrl());
if (QMessageBox::question(this, tr("Redirect"),
tr("Redirect to %1 ?").arg(redirectedUrl.toString()),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) {
return;
}
startRequest(redirectedUrl, m_json);
return;
}
QString content = m_reply->readAll();
ui->replyEdit->setPlainText(content);
}