将appid appkey appsecret替换即可,只是简单的调用,自己封装,源代码https://download.youkuaiyun.com/download/yonggandess/35319430https://download.youkuaiyun.com/download/yonggandess/35319430
#include "dialog.h"
#include "ui_dialog.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QMessageAuthenticationCode>
#include <QMap>
#include <QDateTime>
#include <QDebug>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QEventLoop>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
qDebug()<< getUrl("你好,我是中国人","cn","en");
}
Dialog::~Dialog()
{
delete ui;
}
QString Dialog::getUrl(const QString &msg,const QString&from,const QString&to )
{
const QString apisecret = "";
const QString apikey = "";
const QString appid = "";
//用小牛翻译还是普通翻译
bool useniuTrans = true;
QString trans = useniuTrans ? "ntrans" : "itrans";
QString ts = useniuTrans ? "ots" : "its";
QString host = QString("%1.xfyun.cn").arg(trans);
QString url = QString("https://%1/v2/%2").arg(host).arg(ts);
QString format = "ddd, dd MMM yyyy HH:mm:ss";
QLocale loc = QLocale(QLocale::English, QLocale::UnitedStates);
QDateTime t = QDateTime::currentDateTime();
QString dateString = loc.toString(t.toUTC(), format) + " GMT";
QString digest = "SHA-256=";
QByteArray hash256Base64 = QCryptographicHash::hash(getJson(msg,from,to,appid).toUtf8(),QCryptographicHash::Sha256).toBase64();
digest += hash256Base64;
QString signature_origin = "host: " + host + "\n";
signature_origin += "date: " + dateString + "\n";
signature_origin += "POST " + QString("/v2/%1 ").arg(ts) + "HTTP/1.1" + "\n";
signature_origin += "digest: " + digest;
QByteArray s_o = NULL, api = NULL;
QByteArray signature = QMessageAuthenticationCode::hash(s_o.append(signature_origin),
api.append(apisecret), QCryptographicHash::Sha256).toBase64();
//签名信息
QString authorization = "api_key=\"";
authorization += apikey + "\"";
authorization += ",algorithm=";
authorization += "\"hmac-sha256\"";
authorization += ",headers=";
authorization += "\"host date request-line digest\"";
authorization += ",signature=\"";
authorization += signature + "\"";
QList<QPair<QString, QString>> formData;
formData.append(QPair<QString,QString>{"Content-Type","application/json"});
formData.append(QPair<QString,QString>{"Accept","application/json,version=1.0"});
formData.append(QPair<QString,QString>{"Host",QString("%1.xfyun.cn").arg(trans)});
formData.append(QPair<QString,QString>{"Date",dateString});
formData.append(QPair<QString,QString>{"Digest",digest});
formData.append(QPair<QString,QString>{"Authorization",authorization});
QString result;
QByteArray body_ = getJson(msg,from,to,appid).toUtf8();
//post
QByteArray responseData = this->post(url,formData,body_);
//json解析
QString res_;
QJsonObject root = QJsonDocument::fromJson(responseData).object();
int code = root.value("code").toInt();
if(0 == code) {
QJsonObject dataObj = root.value("data").toObject();
QJsonObject resultObj = dataObj.value("result").toObject();
res_ = resultObj.value("trans_result").toObject().value("dst").toString();
}else{
qDebug()<<"ifly trans error!";
}
return res_;
}
QString Dialog::getJson(const QString &msg, const QString &from, const QString &to,const QString&appid)
{
//common
QJsonObject commonObj;
commonObj.insert("app_id",appid);
//business
QJsonObject businessObj;
businessObj.insert("from",from);
businessObj.insert("to",to);
//data
QJsonObject dataobj;
dataobj.insert("text",QString(msg.toUtf8().toBase64()));
QJsonObject obj;
obj.insert("common",QJsonValue(commonObj));
obj.insert("business",QJsonValue(businessObj));
obj.insert("data",QJsonValue(dataobj));
return QString(QJsonDocument(obj).toJson()).simplified();
}
QByteArray Dialog::post(const QString &url, QList<QPair<QString, QString>> header, const QByteArray &body)
{
QUrl url_(url);
QNetworkRequest request(url_);
for(auto item : header)
request.setRawHeader(item.first.toUtf8(),item.second.toUtf8());
QNetworkAccessManager manager;
QNetworkReply* reply = manager.post(request,body);
QEventLoop loop;
connect(reply,&QNetworkReply::finished,&loop,&QEventLoop::quit);
loop.exec();
QByteArray responseData = reply->readAll();
delete reply;reply = nullptr;
return responseData;
}