找回密码
 立即注册
收起左侧

HTTPS请求偶尔无响应

2
回复
5583
查看
[复制链接]

尚未签到

来源: 2019-3-18 15:30:54 显示全部楼层 |阅读模式
3Qter豆
我自己写了一个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这个类的问题还是我代码逻辑有问题?

最佳答案

查看完整内容

createConnect 这个放到点击函数里面不合适,建议放到构造函数了面试试 ~ 不行就加群:点击链接加入群聊【Qt 萌新】:https://jq.qq.com/?_wv=1027&k=5XRacvT
回复

使用道具 举报

累计签到:742 天
连续签到:1 天
2019-3-18 15:30:55 显示全部楼层
createConnect 这个放到点击函数里面不合适,建议放到构造函数了面试试 ~
不行就加群:点击链接加入群聊【Qt 萌新】:https://jq.qq.com/?_wv=1027&k=5XRacvT
回复

使用道具 举报

尚未签到

2019-3-19 00:43:08 显示全部楼层
Since 发表于 2019-3-18 18:51
createConnect 这个放到点击函数里面不合适,建议放到构造函数了面试试 ~
不行就加群:点击链接加入群聊【Q ...

好的 我试试 ~  可是我想在超时的时候disconnect掉QNetworkAccessManager的finished信号,我不想既触发超时,又触发finished信号。那怎么办呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了