Qt http请求超时与错误处理

本文介绍如何使用QTimer和QNetworkReply的超时机制,配合replyTimeout槽函数,实现HTTP请求的定时关闭,并处理QNetworkReply的错误状态。实例中详细展示了如何在3秒后自动断开网络请求并进行后续数据处理。
一、通过 QTimer 超时实现控制QNetworkReply请求时间,通过调用reply->close()触发QNetworkReply::finished信号,进行数据处理。
代码.h
#ifndef REPLYTIMEOUT_H
#define REPLYTIMEOUT_H

#include <QObject>

class QNetworkReply;

class ReplyTimeout : public QObject
{
    Q_OBJECT
public:
    ReplyTimeout(QNetworkReply* reply, const int timeout);

private slots:
    void replyTimeout();
};

#endif // REPLYTIMEOUT_H

.cpp

#include <QNetworkReply>
#include <QTimer>
#include "replytimeout.h"

ReplyTimeout::ReplyTimeout(QNetworkReply *reply, const int timeout)
{
    if (reply) {
        setParent(reply);
        QTimer::singleShot(timeout, this, &ReplyTimeout::replyTimeout);
    }
}

void ReplyTimeout::replyTimeout()
{
    QNetworkReply* reply = qobject_cast<QNetworkReply*>(parent());
    if (reply) {
        reply->close();
    }
}

调用方法:

QNetworkReply *HttpClient::requestQrCode(const QString &clientId, const QString &deviceId, const QString &uuid,
                                         const int &scene, const QString &redirectUrl, const int &sceneType,
                                         const QString &gender, const QString &school, const QString &defaultAvatar,
                                         const QString &nick)
{
    QJsonObject json2;
    json2.insert("gender", gender);
    json2.insert("school", school);

    QJsonObject json1;
    json1.insert("clientId", clientId);
    json1.insert("deviceId", deviceId);
    json1.insert("uuid", uuid);
    json1.insert("scene", scene);
    json1.insert("sceneType", sceneType);
    json1.insert("defaultAvatarEnum", defaultAvatar);
    json1.insert("nick", nick);
    json1.insert("remark", json2);

    QJsonObject jsonRoot;
    jsonRoot.insert("codeInfoDTO", json1);
    jsonRoot.insert("redirectUrl", redirectUrl);
    qInfo() << "requset" << QJsonDocument(jsonRoot).toJson(QJsonDocument::Compact);
    
    QNetworkRequest requset = setNetWorkRequest("/qrcode/generating");
    QNetworkReply *replay = httpRequset("post", requset, QJsonDocument(jsonRoot).toJson(QJsonDocument::Compact));
	//调用超时类
    new ReplyTimeout(replay, 3000);
    return replay;
二、Http请求报错处理
	//请求连接服务器
    QNetworkReply *reply = HttpClient::instance()->requestQrCode("", hardwareID, uuid, 8, "", BindorUnbind, gender, QString::number(chirdinfo.grade),
                                                                  chirdinfo.avatar, chirdinfo.name);
    //绑定finised信号,数据处理                                                           
    connect(reply, &QNetworkReply::finished, this, &BindingDialog::onRequestQrCodeResult);
    //reply错误后,断开连接(例:服务器连接失败等错误,可进行分类处理)
    connect(reply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error),
            this, [=] {
                reply->disconnect();
                reply->close();
                reply->abort();
                reply->deleteLater();
            });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值