代码如下
#include "answer.h"
#include "http.h"
#include <ui_mainwindow.h>
Answer::Answer(QObject *parent) : QObject(parent)
{
}
QString Answer::getAnswer(QString question)
{
QString accessToken;
QString tokenUrl=QString(answerToken).arg(answerclient_id).arg(answerclient_secret);//结合AT请求
QMap<QString,QString> header; //请求头信息
header.insert(QString("Content-Type"),QString("application/json"));
header.insert(QString("Accept"),QString("application/json"));
QByteArray requestData;
QByteArray replyData;
Http m_http;
bool result = m_http.post_sync(tokenUrl,header,requestData,replyData);
if(result){
QString key = "access_token";
accessToken = getJsonValue(replyData,key);
}
else {
QMessageBox::critical(NULL,"网络错误","获取token数据失败");
return "";
}
QString aiUrl=QString(baiduAiurl).arg(accessToken);//二次请求url
replyData.clear();
requestData=QString("{\
\"endpoint\":\"ERNIE-Speed-128K\",\
\"messages\":{\
\"role\":\"user\",\
\"content\":\"%1\"\
}\
}").arg(question).toUtf8();
//requestData = question.toLocal8Bit();
result=m_http.post_sync(aiUrl,header,requestData,replyData);
if(result)
{
QString key="result";
QString text=getJsonValue(replyData,key);
qDebug() << "Reply:" << replyData;
return text;
}
QMessageBox::critical(NULL,"网络错误","获取识别数据失败");
return "";
}
QString Answer::getJsonValue(QByteArray ba, QString key)
{
QJsonParseError parseError;
QJsonDocument jsonDocument = QJsonDocument::fromJson(ba,&parseError);
if(parseError.error==QJsonParseError::NoError)
{
if(jsonDocument.isObject())//如果是js对象
{
QJsonObject jsonobj=jsonDocument.object();//转换为对象
if(jsonobj.contains(key))//判断有无key键对应值
{
QJsonValue jsonval=jsonobj.value(key);//得到val值
if(jsonval.isString())//是否为字符串
{
return jsonval.toString();
}
else if(jsonval.isArray())
{
QJsonArray arr=jsonval.toArray();//转化为标准json数组
QJsonValue jv=arr.at(0);//取出第0个值
return jv.toString();
}
}
}
}
return "";
}
//改动了一下代码,错误报告"error_code":336002,"error_msg":"Invalid JSON"