【问题标题】:How to send a REST call with Qt?如何使用 Qt 发送 REST 调用?
【发布时间】:2020-10-12 12:27:12
【问题描述】:

我已经开始使用 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;
}

在我的主函数中调用此方法后,如果我签入提琴手,我也看不到任何请求,程序进入无限循环。你能告诉我有什么问题吗?

【问题讨论】:

    标签: c++ qt5 qtnetwork


    【解决方案1】:

    原因

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多