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;
}