在线翻译工具的开发调用了百度的翻译接口。通过该接口的调用我们可以学会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