0
点赞
收藏
分享

微信扫一扫

Qt网络与通信HTTPS(在线翻译工具)

老榆 2022-04-26 阅读 83

在线翻译工具的开发调用了百度的翻译接口。通过该接口的调用我们可以学会Qt网络通信的https的接口访问调用。

https网络请求访问。

注:windows和linux下都需安装openssl。

效果展示

AppSecret:百度应用的appscret

Token: 百度应用的appscret

百度应用注册地址: 百度智能云-登录

流程图

 

资料地址

开发地址为文档地址;机器翻译 - 文档

机器翻译 - 文档

源码分析

// 发送https请求前准备工作;
    QSslConfiguration config;
    QNetworkRequest request;
    QByteArray post_Array;
    QJsonDocument doc;
    QSslConfiguration conf = request.sslConfiguration();

    // https://aip.baidubce.com/oauth/2.0/token
    request.setUrl(QUrl(m_strTokenUrl)); 
    request.setHeader(QNetworkRequest::ContentTypeHeader,
                      QVariant("application/json"));

    QByteArray postData;
    postData.append("grant_type=client_credentials&client_id=" +
                    m_ptrLineEditAppSecret->text() +
                    "&client_secret=" + m_ptrLineEditToken->text());

    qInfo() << "post_Array:" << post_Array;
    QNetworkReply *pReply = manager->post(request, postData);
    connect(pReply, SIGNAL(error(QNetworkReply::NetworkError)), this,
            SLOT(onHttpGetError(QNetworkReply::NetworkError)));

QSslConfiguration


QSslConfiguration : ssl的配置文件.用于设置https的访问配置文件。

QNetworkAccessManager

QNetworkAccessManager 网络访问API是围绕一个QNetworkAccessManager对象构建的,该对象保存它发送的请求的公共配置和设置。它包含代理和缓存配置,以及与此类问题相关的信号,以及可用于监控网络操作进度的回复信号。一个QNetworkAccessManager实例应该足以支持整个Qt应用程序。由于QNetworkAccessManager基于QObject,因此只能从它所属的线程使用它。创建QNetworkAccessManager对象后,应用程序可以使用它通过网络发送请求。提供了一组标准函数,它们接受一个请求和可选数据,每个函数都返回一个QNetworkReply对象。返回的对象用于获取响应相应请求而返回的任何数据。

finished信号:https访问放回成功以后的数据返回。

QNetworkReply

QNetworkReply类包含QNetworkAccessManager发送的请求的数据和头。

QNetworkReply类包含与QNetworkAccessManager发布的请求相关的数据和元数据。与QNetworkRequest一样,它包含一个URL和标题(解析和原始形式)、一些关于回复状态和回复本身内容的信息。

QNetworkReply是一种顺序访问设备,这意味着一旦从对象中读取数据,设备就不再保存数据。因此,如果需要,应用程序有责任保留这些数据。每当从网络接收到更多数据并进行处理时,就会发出readyRead()信号。

downloadProgress()信号在接收数据时也会发出,但如果对内容进行任何转换(例如,解压缩和消除协议开销),其中包含的字节数可能并不代表接收到的实际字节数。

尽管QNetworkReply是一个连接到回复内容的QIODevice,但它也会发出uploadProgress()信号,指示具有此类内容的操作的上载进度。

QtJson序列化与反序列化。

源码

#include "mainwindow.h"
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , m_ptrWdgMain(new QWidget())
    , m_ptrLabAppSecret(new QLabel("AppSecret"))
    , m_ptrLineEditAppSecret(new QLineEdit())
    , m_ptrLabAppToken(new QLabel("Token"))
    , m_ptrLineEditToken(new QLineEdit())
    , m_ptrLayoutApp(new QGridLayout())
    , m_ptrLayoutMain(new QVBoxLayout())
    , m_ptrTextEditInput(new QTextEdit())
    , m_ptrTextEditOutput(new QTextEdit())
    , m_ptrCmbSource(new QComboBox())
    , m_ptrCmbTraget(new QComboBox())
    , m_ptrLabText(new QLabel("翻译成"))
    , m_ptrLayoutConfig(new QHBoxLayout())
    , m_ptrBtnDowork(new QPushButton("翻译"))
    , m_strApiUrl("https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1")
    , m_strTokenUrl("https://aip.baidubce.com/oauth/2.0/token")
    //  , m_strTokenUrl("https://www.baidu.com")
    , manager(new QNetworkAccessManager(this))
    , managerData(new QNetworkAccessManager(this))

{
    initUI();
    initConnect();
    readConfig();
}

MainWindow::~MainWindow() {}

void MainWindow::readConfig()
{
    QString Path = QCoreApplication::applicationDirPath();
    QString endPath = Path + "/config.ini";
    QFileInfo fileinfo(endPath);
    if (!fileinfo.isFile()) {
        qDebug() << "文件不存在";
    }
    QSettings setting(endPath, QSettings::IniFormat);
    setting.beginGroup("APP");
    QString strAppSecret = setting.value("AppSecret", "").toString();
    QString strToken = setting.value("Token", "").toString();

    m_ptrLineEditAppSecret->setText(strAppSecret);
    m_ptrLineEditToken->setText(strToken);
}

void MainWindow::saveConfig()
{
    QString Path = QCoreApplication::applicationDirPath();
    QString endPath = Path + "/config.ini";
    QFileInfo fileinfo(endPath);
    if (!fileinfo.isFile()) {
        qDebug() << "文件不存在";
    }
    QSettings setting(endPath, QSettings::IniFormat);
    setting.beginGroup("APP");
    //读配置文件
    //写入配置文件
    setting.setValue("AppSecret", m_ptrLineEditAppSecret->text());
    setting.setValue("Token", m_ptrLineEditToken->text());
}

void MainWindow::initUI()
{
    m_ptrLayoutApp->addWidget(m_ptrLabAppSecret, 0, 0);
    m_ptrLayoutApp->addWidget(m_ptrLineEditAppSecret, 0, 1);
    m_ptrLineEditAppSecret->setEchoMode(QLineEdit::Password);
    m_ptrLayoutApp->addWidget(m_ptrLabAppToken, 1, 0);
    m_ptrLayoutApp->addWidget(m_ptrLineEditToken, 1, 1);
    m_ptrLineEditToken->setEchoMode(QLineEdit::Password);
    m_ptrLayoutMain->addLayout(m_ptrLayoutApp);

    m_ptrLayoutMain->addWidget(m_ptrTextEditInput);

    m_ptrLayoutConfig->addWidget(m_ptrCmbSource);
    m_ptrLayoutConfig->addWidget(m_ptrLabText);
    m_ptrLayoutConfig->addWidget(m_ptrCmbTraget);
    m_ptrLayoutMain->addLayout(m_ptrLayoutConfig);

    m_ptrCmbTraget->addItem("英语");
    m_ptrCmbTraget->addItem("日语");

    m_ptrLayoutMain->addWidget(m_ptrTextEditOutput);
    m_ptrLayoutMain->addWidget(m_ptrBtnDowork);

    m_ptrWdgMain->setLayout(m_ptrLayoutMain);
    setCentralWidget(m_ptrWdgMain);
}

void MainWindow::initConnect()
{
    connect(m_ptrBtnDowork, SIGNAL(clicked()), this, SLOT(slotDowork()));
    connect(managerData, SIGNAL(finished(QNetworkReply *)), this,
            SLOT(slotGetOuput(QNetworkReply *)));
    connect(manager, SIGNAL(finished(QNetworkReply *)), this,
            SLOT(slotGetToken(QNetworkReply *)));
}

void MainWindow::getToken()
{
    // 发送https请求前准备工作;
    QSslConfiguration config;
    QNetworkRequest request;
    QByteArray post_Array;
    QJsonDocument doc;
    QSslConfiguration conf = request.sslConfiguration();
    //    conf.setPeerVerifyMode(QSslSocket::VerifyNone);
    //    conf.setProtocol(QSsl::TlsV1_1);
    //    request.setSslConfiguration(conf);

    request.setUrl(QUrl(m_strTokenUrl));  // "https://www.temp.com"
    request.setHeader(QNetworkRequest::ContentTypeHeader,
                      QVariant("application/json"));

    QByteArray postData;
    postData.append("grant_type=client_credentials&client_id=" +
                    m_ptrLineEditAppSecret->text() +
                    "&client_secret=" + m_ptrLineEditToken->text());

    qInfo() << "post_Array:" << post_Array;
    QNetworkReply *pReply = manager->post(request, postData);
    connect(pReply, SIGNAL(error(QNetworkReply::NetworkError)), this,
            SLOT(onHttpGetError(QNetworkReply::NetworkError)));
}

void MainWindow::slotGetToken(QNetworkReply *reply)
{
    QVariant variant;
    QJsonParseError jsonError;

    QByteArray rece = reply->readAll();
    QJsonDocument json_doc = QJsonDocument::fromJson(rece, &jsonError);
    QJsonObject json_obj = json_doc.object();
    QJsonValue jsonRefresh_token = json_obj.value("refresh_token");
    QJsonValue jsonAccess_token = json_obj.value("access_token");
    qInfo() << "Refresh_token:" << jsonRefresh_token.toString();
    qInfo() << "Access_token:" << jsonAccess_token.toString();
    qInfo() << QString(rece);
    QString url = m_strApiUrl + "?access_token=" + jsonAccess_token.toString();
    QJsonObject jsonPostData;
    jsonPostData.insert(
        "q",
        QJsonValue(m_ptrTextEditInput->toPlainText().toStdString().c_str()));
    jsonPostData.insert("from", "auto");
    jsonPostData.insert("to", getTarget());
    QByteArray strpostData = QJsonDocument(jsonPostData).toJson();
    qInfo() << "strpostData:" << strpostData;
    QNetworkRequest request;
    request.setUrl(QUrl(url));  // "https://www.temp.com"
    request.setHeader(QNetworkRequest::ContentTypeHeader,
                      QVariant("application/json"));
    QNetworkReply *pReply = managerData->post(request, strpostData);
    connect(pReply, SIGNAL(error(QNetworkReply::NetworkError)), this,
            SLOT(onHttpGetError(QNetworkReply::NetworkError)));
}

void MainWindow::slotGetOuput(QNetworkReply *reply)
{
    QByteArray rece = reply->readAll();
    qInfo() << rece;
    QJsonParseError jsonError;
    QJsonDocument json_doc = QJsonDocument::fromJson(rece, &jsonError);
    QJsonObject jsonPostData = json_doc.object();
    QJsonObject jsonResult = jsonPostData.value("result").toObject();
    QJsonValue jsontRans_result = jsonResult.value("trans_result");
    QJsonArray jsontRans_resulta = jsontRans_result.toArray();
    qInfo() << "jsontRans_resulta" << jsontRans_resulta;

    QJsonObject jsonDst = jsontRans_resulta.at(0).toObject();
    qInfo() << "json_doc2:" << jsonDst;
    QString strDst = jsonDst.value("dst").toString();
    qInfo() << "jsonDst:" << strDst;
    m_ptrTextEditOutput->setText(strDst);
}

void MainWindow::onHttpGetError(QNetworkReply::NetworkError code)
{
    QMetaEnum metaMnum = QMetaEnum::fromType<QNetworkReply::NetworkError>();
    QString error = metaMnum.valueToKey(code);
    qWarning() << "地址调用失败 :" << error;
}

QString MainWindow::getTarget()
{
    switch (m_ptrCmbTraget->currentIndex()) {
        case 0:
            return "en";
        case 1:
            return "jp";
    }
    return "jp";
}
void MainWindow::slotDowork()
{
    saveConfig();
    getToken();
}

源码传送门

点击下面跳转到源码。

QtNetWork/HttpFanyi · master · 啊渊 / QT博客案例 · GitCode

举报

相关推荐

0 条评论