c++ - qnetworkreply 没有状态码或错误但失败
问题描述
我试图找出在 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;
}
}
}
推荐阅读
- php - 警告:key() 期望参数 1 是数组,给定字符串
- vue.js - 如何从父组件观察子属性的变化
- spring-mvc - org.springframework.security.core.userdetails.User 不能转换为 MyUserDetails (Junit 5)
- mdx - 你能帮我处理这个 MDX 查询吗?
- flask - 多行在烧瓶模板的VS代码中连接成一行
- javascript - 如何设置 Observable.fromEvent 以处理 jQuery 过滤事件
- android - 使用 SQLiteOpenHelper 和 ContentProvider 为每个应用程序用户使用单独的数据库
- android - 快速连续发送的广播导致广播接收器出现问题
- javascript - 当似乎无法避免时如何避免过多的递归错误
- django - LeaveApplyForm' 对象没有属性 'save'