簡體   English   中英

qnetworkreply 沒有狀態碼或錯誤但失敗

[英]qnetworkreply no statuscode or error but failing

我試圖找出在 qt 中執行獲取請求時出了什么問題。 我的網絡管理器附加了以下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;
        }
    }

然而,狀態始終為空Failing並打印reason ,但之后沒有任何值(我期待一個原因,例如超時、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;
    }

但這不叫。

我怎樣才能知道出了什么問題?

您可以使用以下方法直接獲取錯誤:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM