QT--圖靈機器人
1.登陸圖靈機器人官網注冊一個圖靈機器人
2.獲取apikey
3.pro文件添加
QT += core gui network
4.頭文件
#include <QNetworkAccessManager> //三個http必須頭文件
#include <QNetworkReply>
#include <QNetworkRequest>
5.widget.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QNetworkAccessManager> //三個http必須頭文件
#include <QNetworkReply>
#include <QNetworkRequest>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
QNetworkAccessManager *manager;
QNetworkReply *reply;
QNetworkRequest *requst;
QJsonObject *JsonData; //封裝的json信息
QString getJson(); //解析返回的json信息
void Json_data(); //封裝json信息
private slots:
void doProcessReadyRead();
void on_pushButton_clicked();
void doProceesFinished();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
6.widget.cpp文件
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QFile>
#include <QPixmap>
#include <QJsonObject> //json
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
Json_data();
manager = new QNetworkAccessManager(this);
requst = new QNetworkRequest;
}
Widget::~Widget()
{
delete ui;
}
/* HTTP通信 */
void Widget::on_pushButton_clicked()
{
requst->setUrl(QUrl("http://openapi.tuling123.com/openapi/api/v2")); //填入圖靈機器人接口地址
requst->setHeader(QNetworkRequest::ContentTypeHeader,"application/json"); //設置數據類型為json格式
QJsonDocument document=QJsonDocument(*JsonData); //將封裝的json格式數據轉為字節數組形式
QByteArray array = document.toJson();
reply = manager->post(*requst,array); //以post方式發送請求
connect(reply, &QIODevice::readyRead, this, &Widget::doProcessReadyRead); //收到返回信息則發出可讀信號
connect(reply, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error), //出現異常
[=](QNetworkReply::NetworkError code)
{
switch((int)code)
{
case QNetworkReply::ConnectionRefusedError:
qDebug() << "遠程服務器拒絕連接(服務器不接受請求)";
break;
case QNetworkReply::HostNotFoundError:
qDebug() << "找不到遠程主機名(無效的主機名)";
break;
case QNetworkReply::TimeoutError:
qDebug() << "與遠程服務器的連接超時";
break;
default:
break;
}
});
connect(reply, &QNetworkReply::finished,this,&Widget::doProceesFinished);
}
/* 獲取信息 */
void Widget::doProcessReadyRead()
{
QString text = getJson(); //解析返回的json信息
ui->textEdit->append(text);
qDebug() << text;
}
/* 封裝要發送的json格式信息 */
void Widget::Json_data()
{
QJsonObject provideInfo;
QJsonObject Text;
QJsonObject Image;
QJsonObject Info;
QJsonObject UserLocation;
QString data = ui->lineEdit->text(); //輸入發送的信息
Text.insert("text",data);
UserLocation.insert("city","成都"); //后面這一塊不必須
UserLocation.insert("province","四川");
UserLocation.insert("street","武侯區");
Info.insert("location",UserLocation);
provideInfo.insert("inputText",Text);
provideInfo.insert("inputImage",Image);
provideInfo.insert("selfInfo",Info);
QJsonObject user;
user.insert("apiKey","2b244339acb64a3d8a8e1b4455a21ead"); // 填入自己注冊的圖靈機器人apiKey 必須
user.insert("userId",""); //填入 id,必須,否則會顯示---沒有上傳userId!
JsonData = new QJsonObject;
JsonData->insert("reqType",0);
JsonData->insert("perception",provideInfo); //嵌套
JsonData->insert("userInfo",user);
qDebug() << *JsonData;
}
/* 解析返回的json格式信息 */
QString Widget::getJson()
{
QByteArray str = reply->readAll(); //獲取信息
QJsonObject json1 = QJsonDocument::fromJson(str).object();
QJsonArray json2 = json1.value("results").toArray();
QJsonObject json3 = json2[0].toObject(); //直接通過下標獲取
// QJsonObject json3;
// for ( int i = 0; i < json2.size(); i++ ) //循環遍歷獲取
// {
// if ( json2[ i ].isObject() )
// {
// json3 = json2[i].toObject();
// qDebug() << i;
// }
// }
QJsonObject json4 = json3.value("values").toObject();
QString text = json4.value("text").toString();
return text;
}
void Widget::doProceesFinished()
{
qDebug() <<"結束";
}
7.widget.ui文件
