13-project-access_token

#if 0
#include "widget.h"
#include "ui_widget.h"
#include <QByteArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QNetworkReply>
#include <QUrlQuery> // 引入QUrlQuery头文件,用于构建POST请求的数据

// Widget类构造函数,负责初始化UI组件和网络管理器,同时发送一个获取访问令牌的网络请求
Widget::Widget(QWidget *parent)
    : QWidget(parent) // 调用基类QWidget的构造函数
    , ui(new Ui::Widget) // 使用初始化列表初始化UI对象指针
    , networkManager(new QNetworkAccessManager(this)) // 初始化网络访问管理器,并将其父对象设为本Widget,以便自动管理内存
{
    ui->setupUi(this); // 调用ui setup方法以加载界面设计

    // 连接网络管理器的finished信号到槽函数handleResponse,以便在网络请求完成时处理响应
    connect(networkManager, &QNetworkAccessManager::finished, this, [=](QNetworkReply *reply) {
        handleResponse(reply);
    });

    // 创建一个QNetworkRequest对象,设置请求的URL和头部信息
    QNetworkRequest request;
    request.setUrl(QUrl("https://aip.baidubce.com/oauth/2.0/token")); // 设置请求的目标URL
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); // 设置请求的内容类型,适应表单数据提交

    // 使用QUrlQuery构建POST请求的数据,包括客户端凭证和密钥
    QUrlQuery postData;
    postData.addQueryItem("grant_type", "client_credentials"); // 添加授权类型参数
    postData.addQueryItem("client_id", "e1GZIVmqmBgdvAFewS8yzgcL"); // 添加客户端ID参数
    postData.addQueryItem("client_secret", "9ab11XUQfgXge7npgr5QCOyJ9rx3084X"); // 添加客户端密钥参数

    // 通过networkManager发送POST请求,携带构建好的数据
    networkManager->post(request, postData.toString(QUrl::FullyEncoded).toUtf8());
}

// Widget类析构函数,负责清理UI对象,避免内存泄漏
Widget::~Widget()
{
    delete ui;
}

// handleResponse槽函数,处理网络请求的响应
void Widget::handleResponse(QNetworkReply *reply)
{
    // 检查网络请求是否成功
    if (reply->error() == QNetworkReply::NoError)
    {
        // 读取并解析响应数据为JSON格式
        QByteArray data = reply->readAll();
        QJsonDocument jsonDoc = QJsonDocument::fromJson(data);

        // 检查JSON文档是否有效且为对象类型
        if (!jsonDoc.isEmpty() && jsonDoc.isObject())
        {
            QJsonObject jsonObj = jsonDoc.object(); // 转换为QJsonObject以便访问其中的字段

            // 提取并打印访问令牌(注意:字段名应与API实际返回的字段一致)
            QString accessToken = jsonObj["access_token"].toString();
            qDebug() << "Access Token:" << accessToken;

            // 这里可以进一步处理accessToken,比如保存或用于发起其他API请求
        }
        else
        {
            // 如果JSON数据为空或格式不正确,则记录日志
            qDebug() << "Received JSON is empty or not an object.";
        }
    }
    else
    {
        // 如果网络请求失败,记录错误信息
        qDebug() << "Network error:" << reply->errorString();
    }

    // 确保回复对象在处理完毕后被删除,释放资源
    reply->deleteLater();
}


#else
#include "widget.h"
#include "ui_widget.h"
#include <QByteArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QNetworkReply>
#include <QUrlQuery>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 连接信号与槽,使用lambda表达式以提高代码可读性
    networkManager=new QNetworkAccessManager(this);
    connect(networkManager, &QNetworkAccessManager::finished, this, &Widget::handleResponse);

    // 准备请求
    QNetworkRequest request;
    request.setUrl(QUrl("https://aip.baidubce.com/oauth/2.0/token"));
    request.setRawHeader("Content-Type","application/json");

    QByteArray data="grant_type=client_credentials&client_id=e1GZIVmqmBgdvAFewS8yzgcL&client_secret=9ab11XUQfgXge7npgr5QCOyJ9rx3084X&";

    networkManager->post(request,data);
}

Widget::~Widget()
{
    delete ui;
}

// 分离处理响应的函数以提高代码清晰度
void Widget::handleResponse(QNetworkReply *reply)
{
    if (reply->error() == QNetworkReply::NoError)
    {
        QByteArray data = reply->readAll();
        QJsonDocument jsonDoc = QJsonDocument::fromJson(data);
        if (!jsonDoc.isEmpty() && jsonDoc.isObject())
        {
            QJsonObject jsonObj = jsonDoc.object();
            QString accessToken = jsonObj["access_token"].toString(); // 注意字段名应与API返回的实际字段匹配,此处修正为"access_token"
            qDebug() << "Access Token:" << accessToken;
        }
        else
        {
            qDebug() << "Received JSON is empty or not an object.";
        }
    }
    else
    {
        qDebug() << "Network error:" << reply->errorString();
    }

    reply->deleteLater(); // 确保回复对象被正确删除
}
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值