c++ - 如何使用 Qt 发送 REST 调用?

标签 c++ qt5 qtnetwork

我已经开始使用 Qt 框架,在阅读了 Qt5 的文档和一些博客中的一些示例之后,我编写了以下程序,但我似乎没有做正确的工作。
我正在编写一个类,我需要为其编写一个登录和注销方法。
对于登录方法,我正在编写以下代码:

void User::login()
{
    const QUrl loginUrl = (this->m_url).append("/api/auth/login");
    QNetworkRequest loginRequest;
    loginRequest.setUrl(loginUrl);
    loginRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    QJsonObject body;
    QJsonObject data;
    data.insert("userName", this->m_userName);
    data.insert("password", this->m_password);
    body.insert("data", data);
    body.insert("provider", "LDAP");

    //loginRequest.setBody(QJsonDocument(body).toJson());
    const QByteArray json = QJsonDocument(body).toJson();

    QNetworkReply* reply = m_manager.post(loginRequest, QJsonDocument(body).toJson());
    while (!reply->isFinished())
    {
        // wait for the request to complete
    }
    QByteArray response_data = reply->readAll();
    QJsonDocument responseJson = QJsonDocument::fromJson(response_data);
    reply->deleteLater();

    std::cout << response_data.toStdString() << std::endl;
}
在我的主函数中调用此方法后,如果我 checkin fiddler ,我也看不到任何请求,程序进入无限循环。你能告诉我有什么问题吗?

最佳答案

原因
正如你所说,程序进入无限循环。您创建的那个:

while (!reply->isFinished())
{
    // wait for the request to complete
}
简单地说,用 QNetworkReply* reply = m_manager.post(loginRequest, QJsonDocument(body).toJson());您不发送请求,而只是声明您希望这样做。在那之后你阻塞了事件循环,让 Qt 没有机会实现你的愿望。
解决方案
按预期使用信号和插槽。将团队视为事件和回调。 QNetworkAccessManager 的描述是一个很好的起点。 :
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, &QNetworkAccessManager::finished,
        this, &MyClass::replyFinished);

关于c++ - 如何使用 Qt 发送 REST 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62517887/

相关文章:

c++ - 同一个类(class),不同的尺寸......?

c++ - 如何更改工具栏中 QAction 的颜色?

qt - 如何打印 QML 对象的自定义属性列表?

c++ - QGraphicsScene 中的鼠标移动跟踪

c++ - Qt 中的 Win32 API

c++ - 使用 QTcpSocket 时出错

c++ - 如何使用/包含 QtNetwork 模块

c++ - 编写 C++ API - 如何保持对 API 内部对象的外部引用?

c++ - GNU make 3.81 - 如何做 '--output-sync=target'

c++ - 标准预定义了哪些用户定义文字?