1.http协议的原理
          http协议属于应用层中的一种协议,它内部也是使用tcp来通信
          比如:彭老师上百度,搜索关键字中美合作
          分析:浏览器 --》tcp客户端
                    百度服务器 --》tcp服务器
                    www.baidu.com --》百度的域名(俗称网址,URL地址)--》浏览器会把域名解析成ip地址和端口号
          理论分析:
                    浏览器把http请求发送(搜索关键字中美合作)给百度的服务器--》百度服务器收到请求之后会自动回复应答信息给本地浏览器--》浏览器接收应答信息,把应答信息在浏览器显示出来即可

   2.QT中http协议的通信流程
          涉及到的类
                   QNetworkRequest  --》http请求信息
                   QNetworkAccessManager --》管理http,发送请求
                   QNetworkReply --》http应答信息
          (1)定义QNetworkRequest请求对象
                              QNetworkRequest::QNetworkRequest(const QUrl &url)
                                                   参数:url --》QUrl是QT中用来表示网址的一个类型
                                                             QUrl::QUrl(const QString &url)
                                                                          参数:url --》你要访问的网址
          (2)定义QNetworkAccessManager类的对象,用该对象发送刚才的请求
                             QNetworkAccessManager::QNetworkAccessManager(QObject *parent = nullptr)
                             QNetworkReply *QNetworkAccessManager::get(const QNetworkRequest &request)
                                                  参数:request --》你刚才定义的请求
          (3)如果请求发送成功,QNetworkAccessManager类的对象会自动触发void QNetworkAccessManager::finished(QNetworkReply *reply)信号,程序员需要主动关联这个信号,在槽函数中去读取应答信息
          (4)在finished(QNetworkReply *reply)信号对应的槽函数中去读取应答信息
                              QNetworkReply读取应答信息--》read/readAll
     
   3.举例使用http协议
                例子一:在QT程序中通过http请求下载网络上图片,并显示
                             bool QPixmap::loadFromData(const QByteArray &data)
                                            参数:data --》图片的原始数据(颜色值)
                             注意:右键复制图片的网址,需要把https改成http(新版本的QT又不需要)
                                       https --》带有加密功能http协议
                                       http --》没有加密
               例子二:获取网址上的天气预报信息--》json数据解析
                            http://www.weather.com.cn/data/cityinfo/101010100.html
             http://www.weather.com.cn/data/sk/101010100.html
        101280101

http下载网络上的图片

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QUrl>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //主动关联finished信号
    connect(&manager,SIGNAL(finished(QNetworkReply *)),this,SLOT(fun(QNetworkReply *)));
}

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

//下载图片
void MainWindow::on_pushButton_clicked()
{
    //获取输入框中输入的网址
    QString urlstr=ui->lineEdit->text();
    //创建QUrl对象
    QUrl url(urlstr);
    //定义http请求
    QNetworkRequest req(url);

    //发送这个请求
    manager.get(req);
}
//读取应答信息
void MainWindow::fun(QNetworkReply *reply)
{
    //读取网址服务器回复的应答信息
    QByteArray buf=reply->readAll();
    //处理应答信息--》由于本例子中从往上下载的是图片,所以buf中存放的就是网上那张图片的颜色数据
    QPixmap map;
    map.loadFromData(buf);
    map.scaled(ui->label->width(),ui->label->height());
    ui->label->setScaledContents(true);
    //在标签上显示图片
    ui->label->setPixmap(map);

}

 4.json数据格式
            json数据:计算机前端开发中经常会用到的一种数据格式,保存信息很方便(比较复杂的信息,信息量很大的)
                            QMap --》键值对--》生活中成对出现的数据
            例如:{"weatherinfo":{"city":"北京","cityid":"101010100","temp1":"18℃","temp2":"31℃","weather":"多云转阴","img1":"n1.gif","img2":"d2.gif","ptime":"18:00"}}
            json数据的组成(三部分组成):
                     对象:  用{}表示,对象里面可以嵌套数组,键值对,其它对象   {{},{},{}}     {[],[],[]}   {键:值,键:值,键:值}    {{},[],键:值}    
                     数组:用[]表示,数组里面只能存放相同类型的数据   [{},{},{}]  [1,2,3]  [[],[],[]],   
                     键值对:键:值,键必须是字符串,值没有要求,值可以任何合法的数据类型

   5.如何解析json数据
            注意: 如果你要解析某个json数据,程序员必须事先知道这个json数据的格式,否则无法解析
            涉及到的类
                      QJsonDocument --》把json数据做规格化存储
                      QJsonObject --》对象
                      QJsonArray --》数组
                      QJsonValue --》值
                      QJsonParseError --》存放解析json数据过程中产生的错误信息
           思路步骤:
                 第一步:把json数据规格化存储
                              [static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = nullptr) 
                                                        返回值:QJsonDocument用来存放规格化存储的json数据
                                                           参数:json --》你要存储的json数据
                                                                    error --》保存解析过程中出现的错误信息
                第二步:严格按照你要解析的json数据,一步步剥洋葱
                              QJsonObject QJsonDocument::object() const  //获取对象
                              QJsonArray QJsonDocument::array() const     //获取数组
                              QJsonValue QJsonObject::value(const QString &key) const  //通过键得到值
                                                     返回值:返回键对应的值
                                                        参数:key --》键
                              QJsonValue类中有很多toxxxx()方法,原因是json数据规定键必须是字符串,值可以是任意类型
                                                   QJsonArray QJsonValue::toArray() const      //把QJsonValue值转成数组
                                                   int QJsonValue::toInt() const                         //把QJsonValue值转成整数
                                                   QJsonObject QJsonValue::toObject() const   //把QJsonValue值转成对象
                                                   QString QJsonValue::toString() const            //把QJsonValue值转成字符串

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QUrl>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //主动关联finished信号
    connect(&manager,SIGNAL(finished(QNetworkReply *)),this,SLOT(fun(QNetworkReply *)));
}

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

//获取网络上的天气预报信息
void MainWindow::on_pushButton_clicked()
{
    //获取输入框中输入的网址
    QString urlstr=ui->lineEdit->text();
    //创建QUrl对象
    QUrl url(urlstr);
    //定义http请求
    QNetworkRequest req(url);

    //发送这个请求
    manager.get(req);
}
//读取应答信息
void MainWindow::fun(QNetworkReply *reply)
{
    //读取网址服务器回复的应答信息
    QByteArray buf=reply->readAll();
    //处理应答信息--》由于本例子中从网络上获取的是天气预报信息(json格式的数据)
    //解析json数据
    //第一步:把json数据规格化
    QJsonDocument doc=QJsonDocument::fromJson(buf);

    //第二步:一步步拆分数据
    //获取最外层的对象
    //"weatherinfo":{"city":"北京","cityid":"101010100","temp1":"18℃","temp2":"31℃","weather":"多云转阴","img1":"n1.gif","img2":"d2.gif","ptime":"18:00"}
    QJsonObject obj=doc.object();
    //通过键"weatherinfo"得到对应的值
    QJsonValue value1=obj.value("weatherinfo");
    //{"city":"北京","cityid":"101010100","temp1":"18℃","temp2":"31℃","weather":"多云转阴","img1":"n1.gif","img2":"d2.gif","ptime":"18:00"}
    QJsonObject obj1=value1.toObject();
    //继续把对象中键值对获取出来
    QJsonValue value2=obj1.value("temp1");
    QString t1=value2.toString();
    QJsonValue value3=obj1.value("temp2");
    QString t2=value3.toString();
    qDebug()<<"最低气温: "<<t1;
    qDebug()<<"最高气温: "<<t2;
}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐