基于Qt的简单通过api接口和图灵机器人聊天
头文件
#include <QWidget>
#include <QtNetwork/QTcpSocket>
#include <QPushButton>
#include <QLineEdit>
#include <QTextEdit>
#include <QVBoxLayout> //垂直
#include <QHBoxLayout> //水平
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QCoreApplication>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include <QString>
#include <QJsonArray>
这里面有些头文件不是必须的(比如布局器,我是通过布局来实现界面的,所以有布局器和各种器件的头文件)。添加头文件之间需要在.pro文件里面Qt后面加上network(即QT += core gui network)。
widget.h
private:
QLineEdit *lin; //输入文本框
QTextEdit *tex; //输出文本框
QNetworkAccessManager *manager;
public slots:
void Send();
void requestFinished(QNetworkReply * reply);
widget.cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
----------------
// 布局
--------------
manager = new QNetworkAccessManager(this);
connect(push,SIGNAL(clicked(bool)),this,SLOT( Send())); //按下键后发送键入lin框里面的内容(push是发送按钮)
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(requestFinished(QNetworkReply*)));
//收到机器人回发的消息时调用
Send()
QString word= lin->text();
QJsonObject obj1;
// obj1.insert("reqType",0);
QJsonObject Info;
Info.insert("apiKey"," "); //第二个参数为自己注册图灵机器人后的apikey
Info.insert("userId"," "); //第二个参数可以随意写(eg:123456)
obj1.insert("userInfo",Info);
/* 根据图灵机器人里面的示例代码格式创建json文件
提示:需要创建一个大的对象( QJsonObject obj1;)再往该对象里面添加其他对象,
最后形成对应格式的json文件 */
QNetworkRequest request;
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");//发送文件为json格式
request.setUrl(QUrl("http://openapi.tuling123.com/openapi/api/v2"));
QByteArray data;
QJsonDocument doc;
doc.setObject(obj1);
data=doc.toJson(QJsonDocument::Indented); //类型转换
manager->post(request,data);
requestFinished
QByteArray data = reply->readAll();
//qDebug()<<"bake"<<(QString)data;
QJsonParseError jsonErrr;
QJsonDocument doucment = QJsonDocument::fromJson(data,&jsonErrr);
// 解析json最重要的地方在于根据创建规则按层次进行解析
if(!doucment.isNull() && (jsonErrr.error == QJsonParseError::NoError))
{
if(doucment.isObject()) //文档为对象
{
QJsonObject obj =doucment.object(); //转换为对象
qDebug()<<"obj"<<obj.value("results");
if(obj.contains("results"))
{
QJsonArray ResArry = obj.value("results").toArray();
QJsonValue value= ResArry.at(0); // 数组里面只有一个json!!!!!!
//访问json里面的内容
if(value.isObject())
{
QJsonObject res = value.toObject();
if(res.contains("values"))
{
QJsonObject val =res.value("values").toObject();
QString Finally_Val =val.value("text").toString();
tex->setText(Finally_Val);
}
}
}
}
}
创建和解析json文件略微复杂,需要仔细研究帮助中心里面api接入教程中的示例代码。
程序结果示例
个人认为解码和转码按照示例代码格式进行编辑是最重要的。
第一次写文,还不太明白其中的套路,望海涵。
关于转码的问题,可以参考此篇博文转码问题