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