http请求网络资源

#ifndef CLOUDCOMM_H
#define CLOUDCOMM_H

#include <QObject>
#include <QNetworkAccessManager>
#include <QVariantMap>
#include <QSharedPointer>

class CloudComm : public QObject
{
    Q_OBJECT
public:
    explicit CloudComm(QObject *parent = nullptr);

    static CloudComm *getInstance();

    // 请求下载升级包
    void downloadUpgradePack(QString &url);

signals:
    // 天气预报情况获取完毕
    void weatherInfoReady(QVariantList &weatherInfoList);
    // 当天气温获取完毕
    void currDayTempRead(QVariantMap &vMap);
public slots:
    // 请求天气预报状况
    void getWeatherInfo();
    // 请求天气预报状况回复
    void weatherInfoOnFinished();

    // 请求当天气温
    void getCurrDayTemp();
    // 请求当天气温回复
    void currDayTempOnFinished();

private:
    QSharedPointer<QNetworkAccessManager> m_netManage;
};

#endif // CLOUDCOMM_H
#include "cloudcomm.h"
#include <QSslConfiguration>
#include <QNetworkReply>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonArray>
#include <QUrlQuery>
#include <QDebug>
#include "weatherinfo.h"
#include "globalsetting.h"
#include "otaupdate.h"

CloudComm::CloudComm(QObject *parent)
    : QObject{parent}
{
    m_netManage = QSharedPointer<QNetworkAccessManager>(new QNetworkAccessManager);
}

CloudComm *CloudComm::getInstance()
{
    static CloudComm instance;
    return &instance;
}

void CloudComm::downloadUpgradePack(QString &url)
{
    QSslConfiguration config = QSslConfiguration::defaultConfiguration();
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    QNetworkRequest req(url);
    req.setSslConfiguration(config);
    req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    QNetworkReply *reply = m_netManage->get(req);
    // 下载文件
    connect(reply, &QNetworkReply::readyRead, OtaUpdate::getInstance(), &OtaUpdate::writeFile);
    // 下载文件结束
    connect(reply, &QNetworkReply::finished, OtaUpdate::getInstance(), &OtaUpdate::downloadFinished);
}

/**********************************************************************
 * 功能描述: 请求天气预报状况
 * 输入参数: 无
 * 输出参数: 无
 * 返 回 值: 无
 * 其它说明: 无
 ***********************************************************************/
void CloudComm::getWeatherInfo()
{
    QSslConfiguration config = QSslConfiguration::defaultConfiguration();
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    QUrl url("https://api.seniverse.com/v3/weather/daily.json");
    QUrlQuery query;
    query.addQueryItem("key", "SJLG53KFaC_bkFowz");
    query.addQueryItem("location", "shenzhen");
    query.addQueryItem("language", "en");
    if (GlobalSetting::getInstance()->unit()) {
        query.addQueryItem("unit", "f");
    } else {
        query.addQueryItem("unit", "c");
    }

    query.addQueryItem("start", "0");
    query.addQueryItem("days", "5");
    url.setQuery(query);

    QNetworkRequest req(url);
    req.setSslConfiguration(config);
    req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    QNetworkReply *reply = m_netManage->get(req);
    connect(reply, &QNetworkReply::finished, this, &CloudComm::weatherInfoOnFinished);
}

/**********************************************************************
 * 功能描述: 请求当天气温
 * 输入参数: 无
 * 输出参数: 无
 * 返 回 值: 无
 * 其它说明: 无
 ***********************************************************************/
void CloudComm::getCurrDayTemp()
{
    QSslConfiguration config = QSslConfiguration::defaultConfiguration();
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    QUrl url("https://api.seniverse.com/v3/weather/now.json");
    QUrlQuery query;
    query.addQueryItem("key", "SJLG53KFaC_bkFowz");
    query.addQueryItem("location", "shenzhen");
    query.addQueryItem("language", "en");
    if (GlobalSetting::getInstance()->unit()) {
        query.addQueryItem("unit", "f");
    } else {
        query.addQueryItem("unit", "c");
    }
    url.setQuery(query);

    QNetworkRequest req(url);
    req.setSslConfiguration(config);
    req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    QNetworkReply *reply = m_netManage->get(req);
    connect(reply, &QNetworkReply::finished, this, &CloudComm::currDayTempOnFinished);
}

/**********************************************************************
 * 功能描述: 请求当天气温回复
 * 输入参数: 无
 * 输出参数: 无
 * 返 回 值: 无
 * 其它说明: 无
 ***********************************************************************/
void CloudComm::currDayTempOnFinished()
{
    QNetworkReply *reply = static_cast<QNetworkReply*>(sender());
    if (reply->error() == QNetworkReply::NoError) {
        if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 200) {
            QByteArray replyByteArray = reply->readAll();
            QJsonParseError jsonError;
            QJsonDocument jsonDouc = QJsonDocument::fromJson(replyByteArray, &jsonError);
            if (jsonDouc.isObject()) {
                QJsonObject now = jsonDouc.object().value("results").toArray().at(0).toObject().value("now").toObject();
                QVariantMap vMap;
                vMap.insert("temperature", now.value("temperature").toString().toInt());
                vMap.insert("code", now.value("code").toString().toInt());
                emit currDayTempRead(vMap);
            }
        }
    }

    reply->deleteLater();
}

/**********************************************************************
 * 功能描述: 请求天气预报状况回复
 * 输入参数: 无
 * 输出参数: 无
 * 返 回 值: 无
 * 其它说明: 无
 ***********************************************************************/
void CloudComm::weatherInfoOnFinished()
{
    QNetworkReply *reply = static_cast<QNetworkReply*>(sender());
    if (reply->error() == QNetworkReply::NoError) {
        if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 200) {
            QByteArray replyByteArray = reply->readAll();
            QJsonParseError jsonError;
            QJsonDocument jsonDouc = QJsonDocument::fromJson(replyByteArray, &jsonError);
            if (jsonDouc.isObject()) {
                QJsonArray daily = jsonDouc.object().value("results").toArray().at(0).toObject().value("daily").toArray();
                QVariantList weatherInfoList;
                QVariantMap weatherInfo;
                foreach (QJsonValue val, daily) {
                    QJsonObject obj = val.toObject();
                    QString date = obj.value("date").toString();
                    QStringList dateList = date.split('-');
                    if (dateList.size() >= 3) {
                        QDate d(dateList[0].toInt(), dateList[1].toInt(), dateList[2].toInt());
                        int dayOfWeek = d.dayOfWeek();
                        weatherInfo.insert("dayOfWeek", dayOfWeek);
                    }

                    int code_day = obj.value("code_day").toString().toInt();
                    weatherInfo.insert("code_day", code_day);
                    int high = obj.value("high").toString().toInt();
                    weatherInfo.insert("high", high);
                    int low = obj.value("low").toString().toInt();
                    weatherInfo.insert("low", low);
                    int precip =  qRound(obj.value("precip").toString().toDouble()*100);
                    weatherInfo.insert("precip", precip);
                    int wind_speed = qRound(obj.value("wind_speed").toString().toDouble());
                    weatherInfo.insert("wind_speed", wind_speed);
                    int humidity = obj.value("humidity").toString().toInt();
                    weatherInfo.insert("humidity", humidity);

                    weatherInfoList.append(weatherInfo);
                }

                emit weatherInfoReady(weatherInfoList);
            }
        }
    }

    reply->deleteLater();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值