Qt HTTP模块——调用API对话DeepSeek
HTTP模块
Qt的网络模块(QtNetwork)支持HTTP/HTTPS协议,提供异步、非阻塞的API,实现客户端与服务器之间的 HTTP 请求与响应交互。
- 核心类:
QNetworkAccessManager:负责协调网络操作(如GET/POST请求),管理请求队列和返回的响应。QNetworkRequest:封装HTTP请求的详细信息(URL、Headers、方法类型等)。QNetworkReply:处理服务器返回的响应数据,包括读取内容、错误处理和元数据(如状态码)。
基本流程
- 创建网络管理器:
QNetworkAccessManager负责管理所有网络请求。 - 构建请求对象:
QNetworkRequest设置URL、请求头、方法等 - 发送请求:调用
get()、post()、put、或deleteResource()方法。 - 处理响应:通过
QNetworkReply的异步信号获取返回数据。 - 错误处理和资源释放:确保及时释放
QNetworkReply对象。
注意
初次使用https请求时,可能会遇到关于OpenSSL的问题
- 引入依赖
#include <QSslSocket> - 查看当前支持的SSL版本
qDebug() << "support version:" << QSslSocket::sslLibraryBuildVersionString();

qDebug() << manager->supportedSchemes();
if (!QSslSocket::supportsSsl()) {
qDebug() << "SSL is not supported!";
return;
}
// 打印当前的SSL版本
qDebug() << "SSL library version:" << QSslSocket::sslLibraryVersionString();
这里我使用的是QT5.15.0版本需要OpenSSL-1_1_1d
如果和我一样可以在这里下载:Win64OpenSSL-1_1_1d.exe
发送GET请求
创建网络管理器
QNetworkAccessManager manager = new QNetworkAccessManager(this);
构建GET请求
// 构建 GET 请求
QUrl url("https://api.example.com/data");
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::UserAgentHeader, "Qt HTTP Client");
发送GET请求
// 发送 GET 请求
QNetworkReply *reply = manager->get(request);
处理响应
// 处理响应(异步)
QObject::connect(reply, &QNetworkReply::finished, [&]() {
if (reply->error() == QNetworkReply::NoError) {
QByteArray data = reply->readAll();
qDebug() << "Response Data:" << data;
} else {
qDebug() << "Error:" << reply->errorString();
}
reply->deleteLater(); // 释放资源
});
发送POST请求 —— 接入DeepSeek的API
由于官网API请求较慢,这里使用了阿里云百炼平台的DeepSeek-API(有免费额度可以使用)
-
在模型广场找到DeepSeek,查看其请求体构造

-
返回结果

由于用到Json相关操作,插入讲一下QJsonObejct
QJsonObject
-
核心特性
- 键值对结构:键为
QString类型,值为QJsonValue类型(可存储字符串、数字、布尔值、数组、对象或null)。 - 与
QJsonDocument配合:实现Json数据的序列化与反序列化
- 键值对结构:键为
-
常用方法
| 方法 | 作用 |
|---|---|
| insert(key, value) | 插入键值对 |
| remove(key) | 删除指定键的项 |
| contains(key) | 检查键是否存在 |
| value(key) | 获取键对应的值(若不存在返回Undifined) |
| keys() | 返回所有键的列表 |
| size() | 获取元素数量 |
| isEmpty() | 判断是否为空 |
- 配合QJsonDocument
- 将 QJsonObject 封装到 QJsonDocument
QJsonDocument doc(obj);
- 将Json对象转为Json字符串
QString jsonStr = doc.toJson(QJsonDocument::Indented); // 格式化输出
- 从响应中读取数据并解析为Json
QJsonDocument response_doc = QJsonDocument::fromJson(response_data);
- 将 QJsonDocument 解析为 QJsonObject
QJsonObject rsp_json = response_doc.object();
- 将 QJsonObject 封装到 QJsonDocument
创建网络管理器并构建Post请求
根据API示例中给出的请求体示例进行构建
在利用QJsonDocument进行序列化后构建Post请求
// 创建网络管理器
manager = new QNetworkAccessManager(this);
// 构建请求体
// 先构建内部的信息对象
QJsonObject messageObj;
messageObj.insert("role", "user");
messageObj.insert("content", "你好");
// 构建完整的请求体
QJsonObject requestBody;
requestBody.insert("model", "deepseek-r1");
requestBody.insert("messages", messageObj);
// 利用QJsonDocument封装Json对象进行序列化
QJsonDocument doc(requestBody);
QByteArray data = doc.toJson();
// 定义api-key用于调用API
QString api_key = "************";
// 创建请求
QNetworkRequest request(QUrl("https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions"));
// 设置请求头
request.setRawHeader("Authorization", ("Bearer " + api_key).toLocal8Bit());
request.setRawHeader("Content-Type", "application/json");
// 发送POST请求
QNetworkReply *reply = manager->post(request, data);
通过槽函数连接响应信号,处理响应的信息
// 连接响应信号
connect(reply, &QNetworkReply::finished, this, [this, reply]() {
if (reply->error()) {
qDebug() << "Error:" << reply->errorString();
} else {
// 获取序列化的Json响应对象
QByteArray response_data = reply->readAll();
// 通过QJsonDocument进行反序列化并转为QJsonObject对象
QJsonDocument response_doc = QJsonDocument::fromJson(response_data);
QJsonObject rsp_json = response_doc.object();
// 根据API示例中返回的结果解析出AI回答的内容
// msg对象
QJsonObject msg = rsp_json.value("choices").toArray()[0].toObject().value("message").toObject();
// 获取AI回答的内容并打印
QString content = msg.value("content").toString();
qDebug() << "AI:" << content;
}
// 响应结束后关闭释放资源
reply->deleteLater();
}
至此完成了一次简单的Post请求,并打印了AI回复的结果,结合界面可以开发出更交互更友好程序
这里写了一个简单的界面Demo可以参考:Github-Qt-HttpRequestDemo-DeepSeek

浙公网安备 33010602011771号