Qt 之 与服务器通信

相关QT Class

  • QNetworkAccessManager Class

  • QNetworkRequest

  • QUrl

  • QNetworkReply

运行结果

相关源码

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);
}
发布了9 篇原创文章 · 获赞 3 · 访问量 897

猜你喜欢

转载自blog.csdn.net/qq_23516957/article/details/103807717