【问题标题】:qnetworkreply no statuscode or error but failingqnetworkreply 没有状态码或错误但失败
【发布时间】:2020-10-02 07:21:31
【问题描述】:

我试图找出在 qt 中执行 get 请求时出了什么问题。 我的networkmanager 附加了以下插槽:

connect(mgr,SIGNAL(finished(QNetworkReply*)),this,SLOT(requestFinished(QNetworkReply*)));

    connect(mgr, SIGNAL(error(QNetworkReply::NetworkError)),
            this, SLOT(slotError(QNetworkReply::NetworkError)));

完成的请求是这样的:

    void FirebaseInteractor::requestFinished(QNetworkReply *rep)
    {
        QVariant statusCode = rep->attribute( QNetworkRequest::HttpStatusCodeAttribute );
        int status = statusCode.toInt();
        if ( status != 200 )
        {
            QString reason = rep->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString();
            qDebug() << "Pushnotification Request failed : " <<reason;
        }
        else{
            qDebug() << "Pushnotification has been send: ";
        }
        if ( !statusCode.isValid() )
        {

            QString status = statusCode.toString(); // or status_code.toInt();
            qDebug() << "Failing " << status;
            int code = statusCode.toInt();
            qDebug() << "Pushnotification Request failed invalid status code." << QString::number(code);
            QString reason = rep->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString();
            qDebug() << "reason " << reason;
            return;
        }
    }

但是,Failingreason 的状态始终为空,但其后没有任何值(我期待一个原因,例如超时、401 等)。

我也试过了:

    int status = statusCode.toInt();

    if ( status != 200 )
    {
        QString reason = rep->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString();
        qDebug() << "Pushnotification Request failed : " <<reason;
    }
    else{
        qDebug() << "Pushnotification has been send: ";
    }

But all reasons/codes are empty.

I also added:

    void FirebaseInteractor::slotError(QNetworkReply::NetworkError error)
    {
        qDebug() << "slotError" << error;
    }

但这没有被调用。

如何找出问题所在?

【问题讨论】:

  • 你想要完成什么?如果你想检查成功,只需打开reply-&gt;error()
  • @waqar 我想查看请求失败的原因(例如服务器返回 401、超时等)。目前我看不到构建失败的任何原因或状态码。
  • if ( !statusCode.isValid() ) 表示statusCode 属于QMetaType::UnknownType,如果发生这种情况,将不会有任何关于status code 的信息。即使请求失败,它也应该是有效的。
  • @Waqar 我怎样才能找出它失败的原因?它在一台电脑上工作,而不是在另一台电脑上工作

标签: c++ qt qnetworkaccessmanager qnetworkreply qnetworkrequest


【解决方案1】:

您可以直接使用:

qDebug() << reply->error();

如果网络请求从未发生,这将不起作用:

    if ( !statusCode.isValid() ) 

因为这意味着QVariant 本身是无效的并且类型为QMetaType::UnknownType Documentation。因此,它不会提供有关 http 请求中出了什么问题的任何信息。为了解决这个问题,这里有一个简单的例子:

if (statusCode.isValid()) { // it needs to be valid
    qDebug() << "Status Code: " << statusCode.toString();
}

或者,您可以打开QNetworkReply::Error()

void FirebaseInteractor::requestFinished(QNetworkReply *rep)
{
    switch (rep->error())
    {
       case QNetworkReply::NoError:
       // No error
       return;
       case QNetworkReply::TimeoutError:
       {
           auto httpStatus =
               reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
           auto httpStatusMessage = reply->attribute(
        QNetworkRequest::HttpReasonPhraseAttribute).toByteArray();
        //...
        break;
       }
    }
}

【讨论】:

  • 如果 isValid 为 false 它将如何运行 qDebug() error 中的每个可能值做一个案例?
  • qDebug() error();给了我错误,SslHandshakeFailedError
  • 如果isValid 为假,这可能意味着任何事情,例如,网络经理无法发出请求或任何事情。我不确定。
  • 你指出了我正确的方向 'qDebug() error(); ' 解决了,如果您在答案中更新它,我会接受
  • SslHandshakeFailedError 在找不到 ssl 证书时发生。确保您已安装并可用 openssl。您也可以使用QSslCertificate::fromPath() 显式读取证书并设置您的QSslConfiguration
猜你喜欢
  • 1970-01-01
  • 2020-09-18
  • 2019-10-12
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 2020-05-29
相关资源
最近更新 更多