1.如何把一个按照json格式的数据封装成http请求
现在有一个需求,想要封装下面这个格式的json代码
{
“max_tokens”: 1200,
“model”: 'gpt-3.5-turbo',
”temperature“: 0.8,
“top_p”: 1,
“presence_penalty”: 1,
”messages“: [
{
“role”: 'system',
“content”: 'You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible.'
},
{
”role“: 'user',
“content”: '你是chatGPT多少?'
}
]
}
按照下面的代码封装
QNetworkAccessManager* manager = new QNetworkAccessManager();
QUrl url("https://api.openai-hk.com/v1/chat/completions");
QNetworkRequest request(url);
// 设置请求头
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
request.setRawHeader("Authorization", "Bearer hk-drqy781000040279c2a3490a643d3dbcbd18480a");
// 构建JSON数据
QJsonObject dataObject;
dataObject["max_tokens"] = 1200;
dataObject["model"] = "gpt-3.5-turbo";
dataObject["temperature"] = 0.8;
dataObject["top_p"] = 1;
dataObject["presence_penalty"] = 1;
QJsonObject userMessage;
userMessage["role"] = "user";
userMessage["content"] = str;
QJsonArray messagesArray;
messagesArray.append(userMessage);
dataObject["messages"] = messagesArray;
QJsonDocument dataDocument(dataObject);
// 发送POST请求
QNetworkReply* reply = manager->post(request, dataDocument.toJson());
//开启事件循环,直到请求完成
QEventLoop loop;
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
// 获取http状态码
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if (statusCode.isValid())
qDebug() << "status code=" << statusCode.toInt();
QVariant reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
if (reason.isValid())
qDebug() << "reason=" << reason.toString();
QNetworkReply::NetworkError err = reply->error();
if (err != QNetworkReply::NoError)
{
// 请求失败
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
QMessageBox::information(this, "warn",
"http post failed, error code = " + statusCode.toString() + " error info: " + reply->errorString());
return;
}
else
{
// 请求成功
// 接收请求结果
QByteArray responseByte = reply->readAll();
QString strRes =parseChatCompletion(responseByte);
// QMessageBox::information(this, "http post success",
// "post response = " + strRes);
ui->talkList->addItem("ai:"+strRes);
}
使用的时候要引入的头文件
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QEventLoop>
2.解析json中的数据
现在又有一个需求要解析下面这个格式json数据中的content的信息
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"logprobs": null,
"message": {
"content": "你好!有什么可以帮助你的吗?",
"refusal": null,
"role": "assistant"
}
}
],
"created": 1723359338,
"id": "chatcmpl-9uFwNCg8EFeOJswKS",
"model": "gpt-3.5-turbo-0125",
"object": "chat.completion",
"system_fingerprint": null,
"usage": {
"completion_tokens": 17,
"prompt_tokens": 9,
"total_tokens": 26
}
}
解析步骤如下
//把响应先转换成ByteArray
QByteArray responseByte = reply->readAll();
// 将QByteArray转换为QJsonDocument
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
// 获取根对象
QJsonObject rootObj = jsonDoc.object();
// 获取choices数组
QJsonArray choicesArray = rootObj["choices"].toArray();
//获取message的索引转换成QJsonObject
QJsonObject choicesObj = choicesArray[0].toObject();
//从message中0号索引中获取message的对象
messageObj = choicesObj["message"].toObject();
//从message对象中获取content
content = messageObj["content"].toString();
分享一解析json的函数,传入QByteArray,返回要解析的QString
QString Widget::parseChatCompletion(const QByteArray &jsonData) {
// 将QByteArray转换为QJsonDocument
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData,&error);
if(error.error!=QJsonParseError::NoError){
qDebug()<<"Failed to parse JSON";
return "解析失败";
}
// 检查JSON是否解析成功
if (jsonDoc.isNull()) {
qDebug() << "Failed to open JSON";
return "打开失败";
}
// 获取根对象
QJsonObject rootObj = jsonDoc.object();
// 遍历choices数组
QJsonArray choicesArray = rootObj["choices"].toArray();
QJsonObject choicesObj = choicesArray[0].toObject();
// 获取message对象
QJsonObject messageObj = choicesObj["message"].toObject();
// 获取content
QString content= messageObj["content"].toString();
return content;
}