Qt 10Http

1.Http

http:超文本传输协议
https相比http来说有安全协议认证,SLL安全协议证书

url格式:
    网址简化:  
         协议://域名:端口号/资源位置?参数=值
    完整的网址(url)中文版本: 
         协议://主机名(域名):端口号/路径/文件名?查询字符串#锚点
         
          ? 是参数和路径连接的符号(第一个参数和路径拼接使用?)
          & 是参数和参数之间连接的符号(参数和参数之间的拼接使用 &

完整的网址结构

#include <QNetworkRequest>              //url网址管理类    专门管理网址

#include <QNetworkAccessManager>        //请求方法管理类    
                    //可以提供请求访问网站的方法,也可以接收回复
#include <QNetworkReply>                //网页回复的数据管理类    

QT += network

在这里插入图片描述

1.构造管理类对象(在私有成员中声明)
    QNetworkAccessManager *manger=new QNetworkAccessManager(this);
----------------------------------------------------------------------------------- 

2.设置一个连接的按钮,转到槽
    构造网络请求类对象
        QNetworkRequest request;
    设置请求的网址:
         request.setUrl(Qurl(ui->lineEdit->text()));
    向网站发送请求,获得数据
        get();
        manger->get(request);
    槽函数:
    void Widget::on_pushButton_clicked()
    {
        QNetworkRequest request;
        request.setUrl(QUrl(ui->lineEdit->text()));
        manager->get(request);
    }
-----------------------------------------------------------------------------------    

3.网页回复数据时会manger会触发一个信号 finished,会传递回复数据的首地址
    绑定信号和槽函数:
        connect(manager, &QNetworkAccessManager::finished, this, &Widget::netReply);
   
    槽函数:
    对回复的数据进行处理:
    void Widget::netReply(QNetworkReply *reply)
                    //带参槽函数,因为触发finished信号时会传递回复数据的首地址
                    //需要用QNetworkReply类的指针来接收才能访问
    {                        
        QByteArray data = reply->readAll();
        qDebug() << "recv: " << data;
        ui->textEdit->setHtml(data);
        ui->textBrowser->setText(data);
            //textBrowser控件  --用于显示文本内容
    }

2.天气预报

通过访问天气预报的网站,返回H5数据,通过解析为Json格式后显示出来
天气网站:http://tianqiapi.com/index/doc?version=day在里面找到请求示例

Json头文件
    #include <QJsonDocument>    //Json文档    可以用来访问Json文档
    #include <QJsonObject>      //Json对象    可以用来封装Json对象
    #include <QJsonArray>        //Json数组    接收Json数组
    #include <QjsonValue>        //Json Value值    
            //Json中有键值对   Key=Value  一个键对应一个Value

Json格式详解

1.可以通过QDate类中的静态方法获得当前的日期
    #include <QData>
    QDate::currentDate():获得当前的日期  追加.day():获得当前的天数
    QString date = QDate::currentDate().toString();
            //日期时String类型
    int day=QDate::currentDate().day();
            //当前的天数是int类型
-----------------------------------------------------------------------------------            
2.将后面七天的日期存入combo box类的复选框中去
    addItem();
    ui->comboBox->addItem(QString("%1").arg(day));
    for(int i=0;i<7;i++)
    {
        ui->comboBox->addItem(QString("%1").arg((day+i)%31));
    }
-----------------------------------------------------------------------------------
3.构造管理类对象(在成员里去声明)
    QNetworkAccessManager manger=new QNetworkAccessManager(this);
    
4.向LineEdit输入天气网站的api,点击查询
        注:接口网址不是进入官网的哪个网站,是网站里面的请求示例,api接口
      eg:
        https://www.yiketianqi.com/free/day?appid=85469147&appsecret=dD2Jou0F&unescape=1
        其中appid是用户账号,appsecret为用户appsecret,在自己账号里可以找到,详情看网站
  -------------------------------------------------------------------------
  构造网络请求类对象:
      QNetworkRequest requqst;
  设置请求的url
      setUrl();
      QString url=QString("https://www.yiketianqi.com/free/week?unescape=1&appid=%1&appsecret=%2&city=%3")
            .arg("85469147").arg("dD2Jou0F").arg(ui->lineEdit->text());   
      requqst.setUrl(QUrl(url));
  发起请求:
      manger->get(requqst);
   -------------------------------------------------------------------------
   槽函数:
       点击查询按键触发:
   void Widget::on_pushButton_clicked()
    {
        QNetworkRequest requqst;
        QString url=QString("https://www.yiketianqi.com/free/week?unescape=1&appid=%1&appsecret=%2&city=%3")
            .arg("85469147").arg("dD2Jou0F").arg(ui->lineEdit->text());
        qDebug()<<"url: "<<url;
        requqst.setUrl(QUrl(url));
        manger->get(requqst);
    }
5.收到回复会触发finished信号,将信号与新的槽函数进行绑定,并在槽函数里实现显示天气的功能
  绑定信号与槽:
        connect(manger,&QNetworkAccessManager::finished,this,&Widget::netReply);
     -------------------------------------------------------------------------
   槽函数中:
     (1)接收信号触发返回的信息的首地址
         QByteArray data=reply->readAll();
         返回的数据格式是H5类型的格式,所以需要将其转换成Json格式便于阅读
         -------------------------------------------------------------------------2)构造Json对象并且通过QJsonDocument中的静态方法将数据转换为Json格式
          fromJson(): 将数据转换为  Json文本类型  
          object():获得文本中的json对象数据
          QJsonObject obj=QJsonDocument::fromJson(data).object()-------------------------------------------------------------------------3)打印转换前的数据,在Json格式转换网站上进行转换,方便自己阅读,然后根据需要进行操作
                  因为虽然代码中转换了数据格式,但是输出Json对象时查看总是不太方便的
                  毕竟我们需要根据其中的内容来满足我们的项目需求,所以要在网站上转换一次方便查看
          qDebug()<<"recv :"<<data;
              运行一次,复制数据在转换网站上进行查看
          qDebug()<<"recv :"<<obj;
              也可以打印转换后的数据,但是不太好阅读
    -------------------------------------------------------------------------4)进行内容的提取:
         contains(key)  :  判断对象中某个 key是否存在
         因为需要更具键(key)来提取值(value),所以内容必须包含该键才能提取
                 if(!obj.contains("update_time"))
                {
                    qDebug()<<"updata_time not exists";
                    return;
                }
        value(key): 获取某个 key的 JsonValue值
        toString(): 将QJsonValue类型转换为 QString类型
        QString time = obj.value("update_time").toString();
        -------------------------------------------------------------------------
         Json数组的提取:
          QJsonArray arr=obj.value("data").toArray();
          QJsonObject o=arr.at(i).toObject();
          
      eg:
          QJsonArray arr=obj.value("data").toArray();
          for(int i=0;i<arr.size();i++)
          {
              QJsonObject o=arr.at(i).toObject();
              if(o.value("date").toString().contains(ui->comboBox->currentText()))
              {
                    ui->label_TemBai->setText(QString("白天温度: %1").arg(o.value("tem_day").toString()));
                    ui->label_TemNight->setText(QString("夜间温度: %1").arg(o.value("tem_night").toString()));
                    ui->label_WindDirc->setText(QString("风向: %1").arg(o.value("win").toString()));
                    ui->label_WindSpeed->setText(QString("风速: %1").arg(o.value("win_speed").toString()));
               }
            }                                              

eg:天气预报工程:

ui界面,布局

在这里插入图片描述

widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QJsonDocument>    //Json文档
#include <QJsonObject>      //Json对象
#include <QJsonArray>       //Json数组
#include <QJsonValue>       //Json value值
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_pushButton_clicked();
    void netReply(QNetworkReply *reply);

private:
    Ui::Widget *ui;
    QNetworkAccessManager *manger;
};
#endif // WIDGET_H
widget.c
#include "widget.h"
#include "ui_widget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QDate>
#include <QDebug>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QHBoxLayout *hb=new QHBoxLayout;
    hb->addWidget(ui->label_City);
    hb->addWidget(ui->lineEdit);
    hb->addWidget(ui->label_Data);
    hb->addWidget(ui->comboBox);
    hb->addWidget(ui->pushButton);

    ui->verticalLayout->setParent(ui->label_Show);

    QVBoxLayout *vb=new QVBoxLayout(this);
    ui->horizontalLayout->setParent(ui->label_Show);
    vb->addLayout(hb);
    vb->addWidget(ui->label_Show);

    //获得日期
    //QString date = QDate::currentDate().toString();

    //QDate::currentDate():获得当前的日期 day():获得当前的天数
    int day=QDate::currentDate().day();
    //qDebug()<<"date: "<<date; 

    ui->comboBox->addItem(QString("%1").arg(day));
    for(int i=0;i<7;i++)
    {
        ui->comboBox->addItem(QString("%1").arg((day+i)%31));
    }

    manger=new QNetworkAccessManager(this);

    connect(manger,&QNetworkAccessManager::finished,this,&Widget::netReply);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    QNetworkRequest requqst;
    QString url=QString("https://www.yiketianqi.com/free/week?unescape=1&appid=%1&appsecret=%2&city=%3")
            .arg("85469147").arg("dD2Jou0F").arg(ui->lineEdit->text());
    qDebug()<<"url: "<<url;
    requqst.setUrl(QUrl(url));
    manger->get(requqst);
}
void Widget::netReply(QNetworkReply *reply)
{
    QByteArray data=reply->readAll();
    QJsonObject obj=QJsonDocument::fromJson(data).object();
    qDebug()<<"recv :"<<data;
    qDebug()<<"recv :"<<obj;
    //contains(key) 
    if(!obj.contains("update_time"))
    {
        qDebug()<<"updata_time not exists";
        return;
    }
    //value(key) :获取某个key的JsonValue值
    //toString():将QJsonValue类型转换为QString类型
    QString time=obj.value("update_time").toString();

    qDebug()<<"recv :"<<time;

    if(!obj.contains("data"))
    {
         qDebug()<<"data not exists";
         return ;
    }
    QJsonArray arr=obj.value("data").toArray();
    for(int i=0;i<arr.size();i++)
    {
        QJsonObject o=arr.at(i).toObject();
        if(o.value("date").toString().contains(ui->comboBox->currentText()))
        {
            ui->label_TemBai->setText(QString("白天温度: %1").arg(o.value("tem_day").toString()));
            ui->label_TemNight->setText(QString("夜间温度: %1").arg(o.value("tem_night").toString()));
            ui->label_WindDirc->setText(QString("风向: %1").arg(o.value("win").toString()));
            ui->label_WindSpeed->setText(QString("风速: %1").arg(o.value("win_speed").toString()));
        }
    }


}
运行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值