项目里需要用到温度湿度的功能,所以就来做一下了,接口是用阿里云上免费的接口,如下图
左边query相当于是请求的参数,具体是需要看接口的帮助的,这里的接口就只需要写城市名,再请求,右上交的Request就是系统帮你写的Http报文,在其下面的第三个板块(带{}的)则是返回的json数据,复制它去json解析的网站就能看到其结构了,如图
解析网站是json解析
下面就是Qt请求的代码
需要包含以下头文件
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
下面是类的声明
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
QNetworkAccessManager *mange;
QNetworkRequest request;
QNetworkReply *reply; // 虚基类
private slots:
void readyReadSlot();
void replyFinish(QNetworkReply *reply);
};
其实注释也写得很明白了,其中函数的参数都可以从上面接口的报文中直接复制。
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
mange = new QNetworkAccessManager(this);
//接口的url
QUrl url("http://jisutqybmf.market.alicloudapi.com/weather/query?city=%E4%B8%9C%E8%8E%9E");
//接口的参数
QUrlQuery query;
query.addQueryItem("city","东莞");
url.setQuery(query);
connect(mange,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinish(QNetworkReply*)));
//报文头部设置
request.setUrl(url);
// request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
request.setRawHeader(QByteArray("Host"),QByteArray("jisutqybmf.market.alicloudapi.com"));
request.setRawHeader(QByteArray("Authorization"),QByteArray("APPCODE 1bc3da8b617343ea83b40c9e5e68116c"));
//请求
mange->get(request);
// connect(reply,SIGNAL(readyRead()),this,SLOT(readyReadSlot()));
}
下面是收到数据和json包的解析
上面的代码当mange收到数据后会触发下面的槽函数。
我将数据打印在了browser上,再接下来json包的解析步骤就很系统化了,对照上面的json解析都知道大概了。需要注意的是{}和[]的区别,如果是[]括起来的,那么它的值就是个数组,可以通过toArray().at(数组第几个元素)再转为对象。像以下这样
QJsonValue result_Value = root_Obj.value("results");//如果results是[]的话
QJsonObject result_Obj = result_Value.toArray().at(0).toObject();
下面就是对上面的json包进行解析了,主要取它的温度和湿度
void Widget::readyReadSlot()
{
qDebug() << __LINE__;
ui->bs->append(QString(reply->readAll()));
}
void Widget::replyFinish(QNetworkReply *reply)
{
qDebug() << __LINE__;
QByteArray js(reply->readAll());
ui->bs->append(QString(js));
QJsonParseError err;
QJsonDocument root = QJsonDocument::fromJson(js,&err);
if(err.error!=QJsonParseError::NoError)//检查是否符合json包结构
{
qDebug() <<"Json格式错误";
return;
}
else
{
QJsonObject result = root.object();
QJsonObject result_obj = result.value("result").toObject();//取result{}
qDebug() <<"格式正确";
ui->temp->setText(result_obj.value("temp").toString());//取result内的键值对
ui->humi->setText(result_obj.value("humidity").toString());
}
}
运行图