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();

创建网络管理器并构建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

posted @ 2025-03-13 17:31  风陵南  阅读(671)  评论(0)    收藏  举报