Qt Http get请求温度湿度

项目里需要用到温度湿度的功能,所以就来做一下了,接口是用阿里云上免费的接口,如下图

在这里插入图片描述
左边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());

    }
}

运行图
在这里插入图片描述

发布了6 篇原创文章 · 获赞 0 · 访问量 233

猜你喜欢

转载自blog.csdn.net/qq_35342292/article/details/104363458