我自己写了一个HTTPAPI的类,成员变量使用了一个QNetworkAccessManager类,然后封装了我程序需要使用的https请求,其中关于登录的请求如下
// 登录请求
void httpAPI::loginRequest(QString username, QString password)
{
timer->start(); // 用于超时处理
request.setUrl(QString("%1://%2/login/").arg(httpProtocal).arg(httpServerAddr));
QByteArray postData = QString("username=%1&password=%2").arg(username).arg(password).toUtf8();
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
createConnect(); // 代码见下
networkManager.post(request, postData);
}
void httpAPI::createConnect()
{
connect(&networkManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(on_finished(QNetworkReply *)), Qt::UniqueConnection);
connect(&networkManager, SIGNAL(sslErrors(QNetworkReply *, const QList<QSslError> &)), this, SLOT(on_sslErrors(QNetworkReply *, const QList<QSslError> &)), Qt::UniqueConnection);
}
然后关于此请求的槽处理函数如下:
if(reply->request().url() == QUrl(QString("%1://%2/login/").arg(httpProtocal).arg(httpServerAddr)))
{
QString resultJson = reply->readAll();
qDebug() << "login" << resultJson;
QJsonParseError jsonErr;
bool result = false;
QString error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(resultJson.toUtf8(), &jsonErr);
if(jsonErr.error == QJsonParseError::NoError) // 是否有错
{
QJsonObject obj = parse_doucment.object();
result = obj.take("result").toBool();
error = obj.take("error").toString();
}
// 发送信号
if(result)
{
emit loginSucceed(); // 发送信号给QMainWindow父类响应
}
else
{
emit loginFailed(error); // 发送信号给QMainWindow父类响应
}
然后登录界面会拥有一个HTTPAPI类的成员指针变量,在界面初始化的时候进行HTTPAPI的初始化,点击登录按钮后主要通过如下代码发送请求
httpApi->loginRequest(ui->lineEditUsername->text(), ui->lineEditPassword->text());
现在的问题是: 我将代码打包发布release版本后,在打开程序进行登录时,第一次登录基本都会造成程序无响应,过大概8,9秒后会发出超时错误处理框(超时错误通过计时器实现,计时器时间设置为5秒),但是查看服务器的日志发现请求是被发送并处理了,但是Qt程序不会进入到主界面(按逻辑应该进入主界面),然后再重新登陆一次才能进入到主界面。 并且进入主界面后,在挂机一段时间之后,再次点击发送http请求的按钮,有很大几率产生与登陆时一样的无响应状态,然后弹出超时错误框。
请问有大佬知道这是为啥吗? 是QNetworkAccessManager这个类的问题还是我代码逻辑有问题? |