Qt发起http请求,get和post方式,并接收响应数据

2023-05-16

目录

    • Qt发起http请求get,异步接收
    • Qt发起http请求post,异步接收
    • Qt发起http请求get和post,收发同步
    • http下载网络图片

Qt发起http请求get,异步接收

get请求无参,只有网络地址,这里以请求城市天气信息为例,发起get请求,返回天气json格式数据
头文件

private:
    void queryWeather();//查询
public slots:
    void replyFinished(QNetworkReply *reply);//刷新的槽
private:
    QString cityName;
    QNetworkAccessManager *manager;  //请求句柄
    QString allinfo;       //所有信息
    //以下皆是当天,未来几天的数据框通过获取日期的数据列表
    QString date;//当前日期
    QString fengli;       //风力
    QString wendu;        //温度
    QString currentwendu;//当前温度
    QString weather_type;  //天气类型
    QString ganmao;//对于感冒提示
    bool isGetData=false;//是否成功获取数据

源文件

manager = new QNetworkAccessManager(this);  //新建QNetworkAccessManager对象
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));//关联信号和槽

//查询天气
void Weather::queryWeather()
{
	cityName = "南京";
    char quest_array[256]="http://wthrcdn.etouch.cn/weather_mini?city=";
    QNetworkRequest quest;
    sprintf(quest_array,"%s%s",quest_array,cityName.toUtf8().data());
    quest.setUrl(QUrl(quest_array));
    quest.setHeader(QNetworkRequest::UserAgentHeader,"RT-Thread ART");
    /*发送get网络请求*/
    manager->get(quest);
}

//信号槽接收网络响应,处理接收到的数据
void Weather::replyFinished(QNetworkReply *reply)
{
    this->isGetData=false;
    allinfo = reply->readAll();

    QJsonParseError err;
    QJsonDocument json_recv = QJsonDocument::fromJson(allinfo.toUtf8(),&err);//解析json对象
    if(!json_recv.isNull())
    {
        QJsonObject object = json_recv.object();
        if(object.contains("data"))
        {
            QJsonValue value = object.value("data");  // 获取指定 key 对应的 value
            if(value.isObject())
            {
                QJsonObject object_data = value.toObject();
                this->cityName=object_data.value("city").toString();
                this->currentwendu=object_data.value("wendu").toString();
                this->ganmao=object_data.value("ganmao").toString();
                if(object_data.contains("forecast"))
                {
                    QJsonValue value = object_data.value("forecast");
                    if(value.isArray())
                    {
                        QJsonObject today_weather = value.toArray().at(0).toObject();
                        weather_type = today_weather.value("type").toString();
                        date = today_weather.value("date").toString();

                        QString low = today_weather.value("low").toString();
                        QString high = today_weather.value("high").toString();
                        wendu = low.mid(low.length()-3,4) +"-"+ high.mid(high.length()-3,4);
                        QString strength = today_weather.value("fengli").toString();
                        strength.remove(0,8);
                        strength.remove(strength.length()-2,2);
                        fengli = today_weather.value("fengxiang").toString() + strength;
                        this->isGetData=true;
                    }
                }
            }
        }

    }else
    {
        qDebug()<<"json_recv is NULL or is not a object !!";
    }
    reply->deleteLater(); //销毁请求对象
    if(isGetData)
    {
        qDebug()<<QString::fromLocal8Bit("获取天气成功");
    }
    else
    {
        qDebug()<<QString::fromLocal8Bit("获取天气失败");
    }
}

Qt发起http请求post,异步接收

qt发起post请求,带网络地址和参数,参数一般为json格式,转QByteArray

//发起post请求
void MainWindow::postHttpRequest()
{
    QNetworkRequest request;
    QNetworkAccessManager* naManager = new QNetworkAccessManager(this);
    QObject::connect(naManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(requestFinished(QNetworkReply*)));

    request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
    request.setUrl(QUrl::fromUserInput(" http://192.168.1.102:2345/notice?num=4567"));

    QJsonObject obj1;
    QJsonObject object;
    object.insert("station","业务受理员");
    object.insert("name","王晨");
    object.insert("number","0001");
    object.insert("pic","http://192.168.1.15:8080/8.jpg");
    object.insert("orderNum","A123456789B");

    obj1.insert("data",object);
    obj1.insert("status","2");

    QByteArray byte_array = QJsonDocument(obj1).toJson();
    qDebug()<< "user  info " << obj1;
    QNetworkReply* reply = naManager->post(request,byte_array);//发起post请求
}

//接收网络响应槽函数
void MainWindow::requestFinished(QNetworkReply *reply)
{
    QString loginResultJson;
    QByteArray bytes = reply->readAll();
    // 获取http状态码
    QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    if(statusCode.isValid())
    {
        qDebug() << "status code=" << statusCode.toInt();
    }

    QNetworkReply::NetworkError err = reply->error();
    if(err != QNetworkReply::NoError)
    {
        qDebug() << "Failed: " << reply->errorString();
    }
    else
    {
        // 获取返回内容
        qDebug() << "loginResultJson  is  " <<  QString::fromStdString(bytes.toStdString());
        loginResultJson =  QString::fromStdString(bytes.toStdString());
        //处理返回数据
    }
}

Qt发起http请求get和post,收发同步

GET和POST方式均可使用,收发同步,并增加了等待接收超时处理。

/**
 * @brief http发送和接收接口
 * @param strUrl HTTP网络URL
 * @param thod HTTP方法,GET或POST
 * @param strInput 发送的数据
 * @param strMessage http返回的错误信息
 * @param strResult http接收响应
 */
void SendAndGetText(QString strUrl, QString thod, QString strInput, QString &strMessage, QString &strResult)
{
    QNetworkRequest oNetRequest;
    oNetRequest.setUrl(QUrl(strUrl));
    
    QNetworkAccessManager oNetAccessManager;
    QNetworkReply* oNetReply = nullptr;
    QByteArray inputTmp;
    
    if (thod == "POST")
    {
        oNetRequest.setRawHeader("Content-Type", "application/octet-stream");
        if(REST_TOKEN == globalHs.transType)
            oNetRequest.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
        oNetReply = oNetAccessManager.post(oNetRequest, strInput.toLocal8Bit());
        //oNetReply = oNetAccessManager.post(oNetRequest, content);
    }
    else if (thod == "GET" )
    {
        oNetReply = oNetAccessManager.get(oNetRequest);
    }
    
    // 添加超时处理,10s超时
    QEventLoop eventloop;
    connect(oNetReply, SIGNAL(finished()), &eventloop, SLOT(quit()));
    QTimer::singleShot(10000, &eventloop, &QEventLoop::quit);
    eventloop.exec();
    
    QByteArray array;
    if(oNetReply->isFinished())
    {
        if(oNetReply->error() == QNetworkReply::NoError)//正常结束,读取响应数据
        {
            strResult = oNetReply->readAll();
        }
        else//异常结束,比如不存在的http服务器,错误信息:Connection refused
        {
        }
    }
    else//超时,错误信息:Operation canceled
    {
        disconnect(oNetReply, &QNetworkReply::finished, &eventloop, &QEventLoop::quit);
        oNetReply->abort();
        qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<" timeout";
    }
    
    QNetworkReply::NetworkError e = oNetReply->error();
    if (e)
    {
        strMessage = oNetReply->errorString();
    }
    
    oNetReply->deleteLater();
}

///调用示例
    QString url = "";//http后台地址url
    QString sendMsg = "";//http发送数据组包
    QString strMessage = "";//错误信息
    QString strResult = "";//http响应
    QString thod = "POST";//POST或GET
    SendAndGetText(url,thod,sendMsg,strMessage,strResult);

    if(strMessage.isEmpty())///HTTP正常响应
    {
        qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<"接收数据 "<<strResult;
    }
    else///HTTP通信异常
    {
        qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<"错误信息 "<<strMessage;
    }

http下载网络图片

/**
 * @brief 获取网络地址图片
 * @param url 图片网络地址,例如http://106.15.226.233/slImg/bg1.png
 * @return QPixmap图片
 */
QPixmap HttpGetPic::GainUrlImage(QString url)
{
    QUrl turl(url);
    QNetworkAccessManager manager;
    QEventLoop loop;
    QNetworkReply *reply = manager.get(QNetworkRequest(turl));
    //请求结束并下载完成后,退出子事件循环
    connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
    //开启子事件循环
    loop.exec();
    QByteArray jpegData = reply->readAll();
    QPixmap pixmap;
    if(!pixmap.loadFromData(jpegData))
    {
        CLOG_ERROR(QString("网络地址获取图片失败,URL=%1").arg(url).toUtf8().data());
    }

    return pixmap;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt发起http请求,get和post方式,并接收响应数据 的相关文章

随机推荐

  • Vins-Mono 论文 && Coding 一 7(2). pose_graph: 回环检测 && 重定位

    一 处理关键帧流程 void PoseGraph addKeyFrame KeyFrame cur kf bool flag detect loop 1 shift to base frame 将当前帧 pose 转换到 drift fre
  • 浅谈STM32串口通信(一)基本介绍和一个字节传输的实现

    文章目录 0 传输引脚1 传输一个字节1 1 发送一个字节1 2 接收一个字节 2 代码2 1 配置2 2 发送一个字节2 3 接收一个字节 0 传输引脚 串口收发共需要三根线 其中 TX脚为发送引脚 RX脚为发送引脚 GND为地 作为电平
  • 图像融合(Image Fusion)简介

    图像融合 Image Fusion 是用特定的算法将两幅或多幅图像综合成一幅新的图像 融合结果由于能利用两幅 或多幅 图像在时空上的相关性及信息上的互补性 xff0c 并使得融合后得到的图像对场景有更全面 清晰的描述 xff0c 从而更有利
  • IP地址分类

    大家好呀 xff0c 我是请假君 xff0c 今天又来和大家一起学习数通了 xff0c 今天要分享的知识是IP地址的分类 各个网段内具有的IP节点数各不相同 xff0c 为了适应这种需求 xff0c IP地址被分成五类 1 A类IP地址的第
  • 解决映射网络驱动器自动断开问题

    解决映射网络驱动器自动断开问题 hzq0201 2012 04 13 06 47 36 2777 收藏 2 版权 映射的网络驱动器在一段时间自动断开 xff0c 是由于服务器服务自动断开连接功能的默认超时期限造成的 xff0c 我们可以通过
  • vector深度探索

    声明 xff1a 本文中所有图件都来自B站侯捷老师授课视频 vecctor 底层实现原理 图1 GNU2 9 实现的容器vector vector 的内存是动态增长的 xff0c vector 最重要的三个成员变量为 三个迭代器 xff1a
  • 发送一个http请求以及url三部分组成和语法

    浏览器从URL中解析出服务器的主机名浏览器讲服务器的主机名转化成服务器的IP地址 xff08 DNS解析 xff09 浏览器将端口号从URL解析出来浏览器建立一条鱼web服务器的TCP连接浏览器向服务器发送一条http请求报文服务器向浏览器
  • 结构体对齐规则

    结构体 xff1a 结构体 xff08 struct xff09 是由一系列具有相同类型或不同类型的数据构成的集合 因为这一特性 xff0c 方便了开发者在使用的过程中可以将需要的不同的数据类型放在一起 xff0c 做成我们需要的数据类型
  • GPS坐标用于机器人定位的简单处理

    文章目录 前言一 GPS数据格式二 GPS坐标转换二维坐标原理三 参考代码1 转换经纬度格式2 解析通过串口获得的NMEA数据3 将经纬度转换为xy平面二维坐标 前言 最近工作上面接触使用GPS的NMEA数据为机器人提供平面坐标定位 xff
  • 学完C++基础后再学什么?

    学完 xff1f 那是什么程度 xff1f STL用得熟练吗 xff1f 算法和数据结构掌握得怎么样呢 xff1f 会写界面吗 xff1f BOOST呢 xff1f 像楼上所说的换一种语言 xff0c 简直是痴人说梦 xff0c 如果不深入
  • 视觉SLAM十四讲:回环检测-知识点+代码

    目录 基于外观的几何关系1 基础知识1 1 准确率和召回率1 2 词袋模型1 3 字典1 4 字典的数据结构1 5 相似度的计算1 6 相似度评分的处理1 7 检测回环后的验证 2 实践与代码解析2 1 创建字典2 2 相似度计算 回环检测
  • QT笔记--QT内类的层次关系,以及控件从属关系

    QT窗口界面使用的类层次如下 只包含了直接使用部分 界面上每一个创建的控件 xff0c 都是一个控件类的对象 xff0c 定义在头文件ui mainwindoow h的类UI MainWindow中 xff0c 并且其中的成员函数setup
  • C_带参数的宏定义

    C 带参数的宏定义 xff23 语言允许宏带有参数 在宏定义中的参数称为形式参数 xff0c 在宏调用中的参数称为实际参数 对带参数的宏 xff0c 在调用中 xff0c 不仅要宏展开 xff0c 而且要用实参去代换形参 带参宏定义的一般形
  • 十进制数转换成十六进制数~C语言

    include lt stdio h gt 下面将整数a转换成十六进制输出的字符串 原理 xff1a 1 xff0c 首先知道0b100000 61 0b10000 2 61 0b1000 2 61 0b100 2 61 0b10 2 利用
  • Qt实现线程安全的单例模式

    实现方式 1 实现单例 把类的构造函数 拷贝构造函数 赋值操作符定义为private的 xff1b 把获取单例的接口和唯一的实例指针定义为static的 xff0c 不需要实例化 xff0c 直接通过类名即可访问 2 支持多线程 采用双重校
  • 文本文件和二进制文件的差异和区别

    广义上的二进制文件包括文本文件 xff0c 这里讨论的是狭义上的二进制文件与文本文件的比较 xff1a 能存储的数据类型不同 文本文件只能存储char型字符变量 二进制文件可以存储char int short long float 各种变量
  • Qt实现记录日志文件log

    概述 Qt有两种实现记录日志的方式 xff0c 第一种是安装自定义的Qt消息处理程序 xff0c 自动输出程序产生的调试消息 警告 关键和致命错误消息的函数 xff1b 第二种是自定义一个类 xff0c 可以在程序指定位置打印输出指定的内容
  • Qt在linux环境下调用动态库,pro工程文件加载库和QLibrary加载库两种方式

    QT调用动态库 xff0c 在编译时和运行时的方式不同 xff0c 编译时可在pro文件加载或使用QLibrary类加载 xff1b 运行时依赖环境变量 xff0c windows下直接把动态库拷贝到可执行文件目录即可 xff0c linu
  • linux下QT发布程序双击打不开解决方法

    现象 Qt开发的程序 xff0c 使用 终端可以打开 xff0c 双击却打不开 阶段一 右键可执行程序 xff0c 选择属性 xff0c 可执行程序类型如果是 application x sharedlib xff0c 在QT的pro文件添
  • Qt发起http请求,get和post方式,并接收响应数据

    目录 Qt发起http请求get xff0c 异步接收Qt发起http请求post xff0c 异步接收Qt发起http请求get和post xff0c 收发同步http下载网络图片 Qt发起http请求get xff0c 异步接收 get