Qt项目天气预报(3) - qt的http编程获取天气数据

概念


Qt中的HTTP编程主要涉及使用Qt的网络模块来进行HTTP请求和处理HTTP响应。Qt提供了一系列类来处理网络通信,其中最常用的类是 QNetworkAccessManager QNetworkRequest QNetworkReply 以及相关的支持类。

编程实例


以下是一个基本的HTTP编程示例,展示了如何使用Qt发送一个简单的HTTP GET请求并处理响应:

步骤 1: 包含必要的头文件

#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QObject>
#include <QDebug>

步骤 2: 发送HTTP请求

创建一个 QNetworkAccessManager 对象,并使用它发送HTTP请求。 QNetworkAccessManager 对象会
异步地处理请求,并返回一个 QNetworkReply 对象。


int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QNetworkAccessManager manager;
QNetworkRequest request(QUrl("http://example.com"));
QNetworkReply *reply = manager.get(request);
QObject::connect(reply, &QNetworkReply::finished, [&]() {
if (reply->error()) {
qDebug() << "Error:" << reply->errorString();
return;
}
QString response = reply->readAll();
qDebug() << "Response:" << response;
});
return a.exec();
}

我们使用 QNetworkAccessManager 的 get 方法发送了一个HTTP GET请求到"http://exa
mple.com"。然后,我们连接了 QNetworkReply 对象的 finished 信号到一个lambda函数,该函数在收
到HTTP响应时被调用。

注:
  进行http请求之前要先把  network 添加到pro文件中

获取天气信息的url:


http://t.weather.itboy.net/api/weather/city/101010100

初始化network对象

构造函数

 //由QNetworkAccessManager 发起request请求:
//QNetworkRequest - 指定请求的url地址
//QNetworkReply网络请求后进行数据读取
    //由QNetworkAccessManager 发起request请求:
    //实例化network对象
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    connect(manager, &QNetworkAccessManager::finished,[](){
        qDebug()<<"manager Finnish!";
    });
   QUrl urlItBoy("http://t.weather.itboy.net/api/weather/city/101010100");
   //QNetworkRequest - 指定请求的url地址
   QNetworkRequest res(urlItBoy); //根据网址实例化QUrl对象,再根据这个对象实例化QNetworkRequest对象
   reply = manager->get(res);
   //网络请求后进行信号读取
   connect(reply,&QNetworkReply::finished,this,&Widget::readHttpReply);

http网络请求后进行读取槽函数

//http网络请求后进行读取槽函数
void Widget::readHttpReply()
{
 //大多数服务器网址返回的编码格式是 utf-8,需要进行格式转化
 QByteArray data = reply->readAll();
 qDebug()<<QString::fromUtf8(data); // 将读到utf-8格式的数据转为QString类型进行输出
}

效果演示

如下图,我们通过http编程获取到网页上的数据了

http请求失败错误处理

修改槽函数,添加错误处理

//http网络请求后进行读取槽函数
void Widget::readHttpReply()
{

    int resCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();//404
    qDebug()<<resCode;
    if(reply->error() == QNetworkReply::NoError && resCode == 200){ // 没出错的情况下执行
        //大多数服务器网址返回的编码格式是 utf-8,需要进行格式转化
        QByteArray data = reply->readAll();
        qDebug()<<QString::fromUtf8(data); // 将读到utf-8格式的数据转为QString类型进行输出
    }
    else{
        //qDebug()<<"请求失败"<<reply->errorString();
        QMessageBox msg;
        msg.setWindowTitle("错误");
        msg.setText("网络请求失败!");
        msg.setStyleSheet("QPushButton{color:red};");//设置按钮样式
        msg.setStandardButtons(QMessageBox::Ok); //添加Ok按钮
        msg.exec();// 调用QMessageBox对象
    }
}

效果演示

状态码


服务器对请求的响应中包含一个状态码,它表示请求的成功或失败,以及失败的原因。常见的状态码包括:
200 OK: 请求成功。
404 Not Found: 请求的资源未找到。
500 Internal Server Error: 服务器内部错误。
301 Moved Permanently: 请求的资源已永久移动到新位置。
 

请求成功:200

请求失败:404

相关推荐

  1. uniapp vue 获取天气数据

    2024-06-16 04:16:02       7 阅读
  2. 天气数据集2-应用RNN做天气预测

    2024-06-16 04:16:02       8 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-16 04:16:02       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-16 04:16:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-16 04:16:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-16 04:16:02       18 阅读

热门阅读

  1. 小白月赛96

    2024-06-16 04:16:02       7 阅读
  2. mysqldump常用备份数据库命令

    2024-06-16 04:16:02       6 阅读
  3. LeetCode 1084, 135, 21

    2024-06-16 04:16:02       7 阅读
  4. AI 绘画工具详解:从基础原理到实践应用

    2024-06-16 04:16:02       11 阅读
  5. CSS概述

    CSS概述

    2024-06-16 04:16:02      5 阅读
  6. 本地生活元宇宙 “苹果之乡”的新鲜事

    2024-06-16 04:16:02       6 阅读
  7. 正式环境下的历史数据迁移方案,你知道几个?

    2024-06-16 04:16:02       5 阅读