简体   繁体   English

qnetworkreply 没有状态码或错误但失败

[英]qnetworkreply no statuscode or error but failing

Im trying to find out what goes wrong when doing a get request in qt.我试图找出在 qt 中执行获取请求时出了什么问题。 I have the following slots attached to my networkmanager :我的网络管理器附加了以下networkmanager

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

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

The request finished is like:完成的请求是这样的:

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

However Status is always empty Failing and reason is printed but there is no value after it (i was expecting a reason eg timeout, 401 etc).然而,状态始终为空Failing并打印reason ,但之后没有任何值(我期待一个原因,例如超时、401 等)。

I also tried:我也试过:

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

but this is not called.但这不叫。

How can I find out whats going wrong?我怎样才能知道出了什么问题?

You can get the error directly using:您可以使用以下方法直接获取错误:

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

This won't work if the network request never happened:如果网络请求从未发生,这将不起作用:

    if ( !statusCode.isValid() ) 

Because this means that the QVariant itself is invalid and has type QMetaType::UnknownType Documentation .因为这意味着QVariant本身是无效的并且具有QMetaType::UnknownType Documentation类型。 Hence it will not give any information about what went wrong in the http request.因此,它不会提供有关 http 请求中出了什么问题的任何信息。 To fix this, here's a simple example:为了解决这个问题,这里有一个简单的例子:

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

Alternatively, you can switch on QNetworkReply::Error()或者,您可以打开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;
       }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM