GPTDemo
Qt 网络接口调用示例项目
该仓库未提供 README,以下为抓取时的仓库信息。
语言组成
- C++
- 92.6%
- QMake
- 7.4%
文件结构
查看完整文件清单(9 个文件)
Code/GptDemo.pro Code/NetWork.cpp Code/NetWork.h Code/main.cpp Code/mainwindow.cpp Code/mainwindow.h Code/mainwindow.ui GptDemo.exe README.md
关键源码
Code/NetWork.h
#ifndef NETWORK_H#define NETWORK_H#include <QObject>#include <QUrlQuery>#include <QEventLoop>#include <QJsonArray>#include <QJsonObject>#include <QMessageBox>#include <QJsonDocument>#include <QNetworkReply>#include <QRegularExpression>#include <QNetworkAccessManager>class NetWork : public QObject{ Q_OBJECTpublic: ~NetWork(); explicit NetWork();public: //获取Accesstoken int handle_GetAccessToken(); //修改询问语句 QString handle_SetEnquireText(const QString &enquiretext); //设置鉴权元素 int handle_SetAuthentication(const QString &key, const QString &secret);private: QString APIKey; //鉴权元素APIKey QString APISecret; //鉴权元素APISecret QByteArray payload; //请求内容 QString accessToken; //返回的AccessToken QNetworkReply *reply; //发送POST请求 QRegularExpression Regex; //正则表达式对象 QNetworkAccessManager *manager; //网络访问管理器};#endif // NETWORK_HCode/NetWork.cpp
#include "NetWork.h"NetWork::~NetWork(){ if(reply!=nullptr){ reply->deleteLater(); delete reply; } delete manager;}NetWork::NetWork(){ //初始化对象 APIKey = ""; APISecret = ""; accessToken = ""; manager = new QNetworkAccessManager(this);}/* 获取Accesstoken * 返回值:int(错误码,-1为异常,0为错误,1为无误)*/int NetWork::handle_GetAccessToken(){ if (reply->error() == QNetworkReply::NoError) { QByteArray responseData = reply->readAll(); //修改正则表达式 Regex.setPattern("\"access_token\":\"([^\"]+)\""); //在JSON字符串中进行匹配 QRegularExpressionMatch match = Regex.match(responseData); // 如果找到匹配项,则提取access_token数据 if (match.hasMatch()) { accessToken = match.captured(1); QMessageBox::warning(nullptr,"提示","设置Accesstoken成功",QMessageBox::Ok); return 1; } } else { accessToken = " "; //Token置为空 QMessageBox::warning(nullptr,"错误",reply->errorString(),QMessageBox::Ok); return 0; }}/* 设置鉴权元素 * 返回值:int(错误码,-1为异常,0为错误,1为无误)*/int NetWork::handle_SetAuthentication(const QString &key, const QString &secret){ //更新APIKey和APISecret APIKey = key; APISecret = secret; //初始化POST请求的参数 QUrlQuery params; params.addQueryItem("grant_type", "client_credentials"); params.addQueryItem("client_id", APIKey); params.addQueryItem("client_secret", APISecret); QByteArray postData = params.toString(QUrl::FullyEncoded).toUtf8(); // 设置URL和请求头部 QNetworkRequest request; request.setUrl(QUrl("https://aip.baidubce.com/oauth/2.0/token")); request.setRawHeader("Content-Type", "application/x-www-form-urlencoded"); request.setRawHeader("Accept", "application/json"); //将请求数据作为第二个参数传递给post函数 reply = manager->post(request, postData); connect(reply, &QNetworkReply::readyRead,this,&NetWork::handle_GetAccessToken); return 1;}/* 修改询问语句 * enquiretext:询问语句 * 返回值:QString&(修改后的询问语句)*/QString NetWork::handle_SetEnquireText(const QString& enquiretext){ //清空请求内容和回复语句 payload = ""; //准备请求数据 QJsonObject messageObject; messageObject["role"] = "user"; messageObject["content"] = enquiretext; QJsonArray messagesArray; messagesArray.append(messageObject); QJsonObject requestBody; requestBody["messages"] = messagesArray; //将JSON对象转换为字符串 QJsonDocument doc(requestBody); payload = doc.toJson(); //设置请求头 QNetworkRequest request; QString url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + accessToken; request.setUrl(QUrl(url)); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); //发送POST请求 reply = manager->post(request, payload); // 等待响应完成 QEventLoop loop; QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); loop.exec(); // 读取响应数据 if (reply->error() == QNetworkReply::NoError) { return reply->readAll(); } else { QMessageBox::warning(nullptr,"错误",reply->errorString(),QMessageBox::Ok); return " "; }}Code/mainwindow.cpp
#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow){ ui->setupUi(this); ai_NetWork = new NetWork();}MainWindow::~MainWindow(){ delete ui;}/* 解析回复语句 * text:回复语句*/void MainWindow::handle_GetAnswerText(const QString &text){ QString hex; //定义正则表达式,用于获取指定result值后的数据 QRegularExpression regular("\"result\":\"(.*?)\""); QRegularExpressionMatch match = regular.match(text); QString matchedString = match.captured(); //捕获匹配正则表达式的数据 //设置正则表达式,用于匹配\x后面的数据 regular.setPattern("\\\\x([0-9A-Fa-f]{2})"); //迭代正则表达式匹配的结果 QRegularExpressionMatchIterator iteration = regular.globalMatch(matchedString); while (iteration.hasNext()) { //循环遍历寻找匹配数据 QRegularExpressionMatch match = iteration.next(); hex = match.captured(1); bool ok; int decimal = hex.toInt(&ok, 16); if (ok) { matchedString.replace(match.capturedStart(), match.capturedLength(), QString(QChar(decimal))); } } //文本处理 matchedString.replace("result\":\"", ""); matchedString.replace("\\n", "\n"); ui->reply_Text->clear(); ui->reply_Text->setText(matchedString);}//询问Aivoid MainWindow::on_enquire_Btn_clicked(){ QString input_Text = ui->question_Text->toPlainText(); if(!input_Text.isEmpty()){ //判断是否输入文字 ui->question_Text->clear(); ui->reply_Text->setText("正在生成回复文本"); QString Str = ai_NetWork->handle_SetEnquireText(input_Text); handle_GetAnswerText(Str); //处理答复语句 } else{ QMessageBox::warning(nullptr,"错误","未输入信息",QMessageBox::Ok); }}//设置鉴权元素void MainWindow::on_set_API_clicked(){ QString input_Key = ui->key_Text->text(); QString input_Secret = ui->secret_Text->text(); if(input_Key.isEmpty() || input_Secret.isEmpty()){ QMessageBox::warning(nullptr,"错误","未输入鉴权元素",QMessageBox::Ok); }else{ ai_NetWork->handle_SetAuthentication(input_Key,input_Secret); //设置鉴权元素 }}Code/main.cpp
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){ QApplication a(argc, argv); MainWindow w; w.show(); return a.exec();}