QNetworkAccessManager实现可手动中断和超时机制的异步Http网络接口

这篇具有很好参考价值的文章主要介绍了QNetworkAccessManager实现可手动中断和超时机制的异步Http网络接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

Qt中的网络访问 API 是围绕 QNetworkAccessManager 对象构建的,该对象保存它发送的请求的通用配置和设置。因此实现Http请求必然需要使用QNetworkAccessManager 来开发。
需要注意的是:QNetworkAccessManager 是基于 QObject 的,所以只能在它所属的线程中使用。

接口实现

//发送请求结构,仅供参考
class PostPackge
{
public:
    QString postPath;
    QJsonObject postBody;
    bool isQuery = false; 
    int timeOut = 120000; //ms
    QNetworkRequest request;
};
//请求数据返回结构,仅供参考
class HttpResultPackge
{
public:
    int httpCode = 0;
    QString httpErrorString;
    QByteArray httpData;
};
//......
QString CYapiInterface::postDataToServerAsync_packge(const PostPackge& postPackge,
                                                     const std::function<void(const HttpResultPackge& resultPackge)> &callBack)
{
    //机制
    QSharedPointer<HttpResultPackge> resultPackge(new HttpResultPackge);
    QString uuid = QUuid::createUuid().toString(QUuid::WithoutBraces);
    //请求管理
    QNetworkAccessManager *netAm = new QNetworkAccessManager();
    QNetworkConfiguration netConfig;
    netConfig.setConnectTimeout(5000); //socket连接请求超时设置
    netAm->setConfiguration(netConfig);
    connect(netAm, &QNetworkAccessManager::finished, this, [this, resultPackge, callBack](QNetworkReply *amReply){
        getHttpResult(resultPackge.data(), amReply);

        callBack(*resultPackge);

        sender()->deleteLater();
    });
    //发送请求
    QNetworkReply *reply = netAm->post(postPackge.request, QJsonDocument(postPackge.postBody).toJson());
    reply->setParent(netAm);
    //超时开始计时
    QTimer *timer = new QTimer(netAm);
    connect(timer, &QTimer::timeout, reply, [reply, resultPackge](){
        if(reply->isRunning()){
            resultPackge->httpCode = QNetworkReply::TimeoutError;
            resultPackge->httpErrorString = QStringLiteral("请求超时");
            reply->close(); //close
        }
    });
    timer->start(postPackge.timeOut);
    //中断机制,仅读操作能够取消
    connect(this, &CYapiInterface::stopQuery, reply, [reply, resultPackge, uuid](const QString& abortUuid, const QString &reason){
        if(reply->isRunning()){
            if(abortUuid == uuid){
                resultPackge->httpCode = QNetworkReply::OperationCanceledError;
                resultPackge->httpErrorString = reason;

                reply->close();
            }
        }
    }, Qt::QueuedConnection);


    return uuid;
}

1.超时机制:利用QTimer定时,在到达设置时间后请求数据还未返回,则会中断请求。
2.中断机制:在请求发送后生成一条uuid并返回,外部调用者可根据该uuid中断请求,但是推荐只能使用查询相关的请求,不然可能会有意料之外的问题出现。文章来源地址https://www.toymoban.com/news/detail-841614.html

到了这里,关于QNetworkAccessManager实现可手动中断和超时机制的异步Http网络接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GD32实现串口空闲(IDLE)中断 + DMA机制接收数据

    前言 串口功能在单片机开发中,是比较常用的外设,熟练使用串口功能也是驱动开发必备的技能之一。 DMA 是一种CPU辅助手段,可以在CPU不参与的情况下,是做一些辅助CPU的事情,如通常的数据搬运。 在没有DMA之前,数据读取时,需要CPU的处理,在多任务处理时,增加资源紧

    2023年04月13日
    浏览(34)
  • 模拟实现.net中的Task机制:探索异步编程的奥秘

    .net中使用Task可以方便地编写异步程序,为了更好地理解Task及其调度机制,接下来模拟Task的实现,目的是搞清楚: Task是什么 Task是如何被调度的 从最基本的Task用法开始 这个命令的作用是将action作为一项任务提交给调度器,调度器会安排空闲线程来处理。 我们使用Job来模拟

    2024年02月06日
    浏览(31)
  • 基于Springboot整合Socket仿微信实现群聊、私聊功能。实现客户端client,服务端server心跳维护、超时机制【一文通】

    博主介绍: ✌java资深开发工程师、Java领域优质创作者,博客之星、专注于Java技术领域和学生毕业项目实战,面试讲解跟进,高校老师/讲师/同行交流合作✌ 胡广愿景: \\\"比特星球\\\",致力于帮助底层人员找到工作, 让每个底层人员都能找到属于自己的星球。 拓展学习领域,获

    2024年02月19日
    浏览(38)
  • 线程池创建线程异步获取Future超时

    其中,future.get是从开始进行get方法时进行计算的时间,非future生成开始计算的,即什么时候get什么时候开始计时。 线程池从生成线程,如果核心线程不为0,则有任务时一直生成核心线程,直至到核心线程,之后开始方队列中,最后任务多就开始开辟新线程到最大线程数。

    2024年02月02日
    浏览(26)
  • RocketMQ消费者可以手动消费但无法主动消费问题,或生成者发送超时

    修改rocketmq文件夹broker.conf 在RocketMQ独享实例中支持IPv4和IPv6双栈,主要是通过在网络层面上同时支持IPv4和IPv6协议栈来实现的。RocketMQ的Broker端、Namesrv端和客户端都需要支持IPv4和IPv6协议,以便能够同时监听IPv4和IPv6地址,并使用相应的协议栈进行通信。在Broker端,我们需要在

    2024年02月13日
    浏览(27)
  • 【嵌入式】HC32F460串口接收超时中断+DMA

            项目需要使用一款UART串口编码器,编码器的数据以波特率57600持续向外发送。但这组数据包没有固定的包头和校验尾,仅仅是由多圈圈数和单圈角度组成的六字节数据码,这样接收到的数组无法确定实际的下标,所以这边考虑用串口接收超时中断+DMA来实现。 【

    2024年02月14日
    浏览(30)
  • C#上位机与三菱FX3UPLC实现异步伪实时串口通信机制(串口类通信可参考)

    串口是串行接口(serial port)的简称,也称为 串行通信接口 或 COM接口。 串口通信(serial communication)是指采用串行通信协议在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。 串口按电气标准及协议来划分,包括RS-232-C、RS-422、RS485等。 在串行通信中,数

    2023年04月21日
    浏览(34)
  • RPC教程 4.超时处理机制

    对比原教程,这里使用context来处理子协程的泄露问题。 超时处理是 RPC 框架一个比较基本的能力,如果缺少超时处理机制,无论是服务端还是客户端都容易因为网络或其他错误导致挂死,资源耗尽,这些问题的出现大大地降低了服务的可用性。因此,我们需要在 RPC 框架中加

    2024年01月24日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包