一、Http通信
1.在tcp基础上封装的应用层协议 (key:value)
GET / HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134
Accept-Language: zh-CN
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Upgrade-Insecure-Requests: 1
Accept-Encoding: gzip, deflate
Host: 192.168.1.182:6789
2.HTTP通信流程
二、Qt中通过HTTP协议获取图片数据
1.在Qt中使用的类
QNetworkAccessManager–管理http通信
QNetworkRequest - -请求内容
QNetworkReply–接收服务器的回应
2.获取数据过程
(1)创建QNetworkAccessManager对象
连接服务器(连接主机) -> 通过域名服务器把域名解析ip地址
QNetworkAccessManager manager;
(2)发送请求
//发送请求
QUrl url(ui->lineEdit->text());
QNetworkRequest request(url);
manager.get(request);//发送请求
当请求完毕会发送finished信号
connect(&manager,&QNetworkAccessManager::finished,this, &HttpShowPictrue::read_data);
(3)接收数据
//通过应答对象读取数据
QByteArray array = reply->readAll();
QPixmap mmp;
mmp.loadFromData(array);//把接收的数据存储在图片空间中
mmp.save("./my.jpg");
//设置尺寸
mmp = mmp.scaled(ui->label->size());
ui->label->setPixmap(mmp);
三、json数据
1.json数据格式
对象:{ } -> 对象中只能存储键值对
例:{“name”:“何青德”, “address:”:“广州”}
数组:[ ] -> 存储同类型数据(数值, 字符串,对象, 数组)
例:[1,2,3,4], [“a”,“b”], [{ }, { }, { }], [[ ],[ ]]
键值: key:value -> key:是字符串, value:可以是数值,数组,字符串,对象
注意:所有的符号不能有中文输入
例如学生信息:
学生(姓名,年龄,分数(c语言,c++,qt))jack, rose
{"student":
[
{"name":"jack","age":20,"score":[80,90,70]},
{"name":"rose","age":19,"score":[90,80,90]}
]
}
2.天气数据json格式
天气api接口http://t.weather.sojson.com/api/weather/city/101280101
data =
{
"cityInfo":
{
"city": "广州市"
},
"data":
{
"shidu": "88%",
"forecast":
[{
"high": "高温 22℃",
"low": "低温 17℃",
"notice": "雨虽小,注意保暖别感冒"
}]
}
}
3.添加头文件
#include<QJsonObject>
#include<QJsonArray>
#include<QJsonValue>
#include<QJsonDocument>
#include<QJsonParseError>
4.解析
(1)把读取的数据data转QJsonDocument
QJsonParseError err;
QJsonDocument doc = QJsonDocument::fromJson(data.toUtf8(),&err);
if(err.error != QJsonParseError::NoError) //检测是否是json格式
{
qDebug()<<"json error";
}
(2)把doc转为要解析的对象
QJsonObject obj = doc.object();
(3)由obj的键data获取对象
QJsonObject dataObj = obj.value("data").toObject();
(4)由dataObj的键forecast获取数组
QJsonArray forecastArray = dataObj.value("forecast").toArray();
(5)获取数组长度 -> 取到数组中的第一个对象
qDebug()<<forecastArray.size(); //数组长度--元素个数
if(forecastArray.size() > 0)
{
QJsonObject forecastArrayObj = forecastArray.at(0).toObject();
}
(6)由forecastArrayObj的键或者对应值
QJsonObject forecastArrayObj = forecastArray.at(0).toObject();
QString high = forecastArrayObj.value("high").toString();
QString low = forecastArrayObj.value("low").toString();
QString notice = forecastArrayObj.value("notice").toString();
5.json格式打包
下面下面json格式数据
{
"data":
{
"shidu": "88%",
"forecast":
{
"high": "高温 22℃",
"low": "低温 17℃",
"notice": "雨虽小,注意保暖别感冒"
}
}
}
(1)最外是一个对象{}
QJsonObject obj;
(2)创建 -> 键为data的对象
QJsonObject dataObj;
//在dataObj对象插入shidu
dataObj.insert("shidu","88%");
(3)先创建forecast对象并且插入数据,后把对象插入到dataObj中
//创建forecast对象
QJsonObject forecastObj;
forecastObj.insert("high","高温 22℃");
forecastObj.insert("low","低温 17℃");
forecastObj.insert("notice","雨虽小,注意保暖别感冒");
(4)把forecast对象插入到dataobj中
dataObj.insert("forecast", forecastObj);
(5)把dataObj插入到最外层对象obj中
obj.insert("data",dataObj);
(6)把打包好的obj对象转为字符串发送/保存
//把obj转为字符串
QJsonDocument doc;
doc.setObject(obj); //把打包好的json数据给到document
QByteArray array = doc.toJson(); 把json格式的对象转为字符串
ui->textBrowser->setText(QString(array));
QJsonArray jsonarray;数组
jsonarray.append(forecastA)给数组添加对象
jsonarray.append(forecastB)