XuehuQHTTPJson

/**** pro文件中添加 ****
QT += network
CONFIG += C++11
***********************/

Qt有QNetworkReply用于HTTP的异步操作,有QJson用于Json字符串的解析和打包,自己封装一个好用的类,把这两个功能结合在一起,使用很方便。当然发送和接收的都要是application/json

使用方法

  1. new一个XuehuQHTTPJson类
  2. 连接readyRead信号
  3. 调用对象的add函数添加一些数据
  4. 调用对象的post/get函数发送请求
  5. 完成后触发readyRead信号,在槽函数里调用getXXX()解析返回的json

头文件

#ifndef XUEHUQHTTPJSON_H
#define XUEHUQHTTPJSON_H

#include <QObject>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonValue>
#include <QString>
#include <QList>
#include <QMap>
#include <QPair>

/* 使用方法
 * private:
    XuehuQHTTPJson *xqj;
 * //构造函数里
    xqj = new XuehuQHTTPJson(this);
    connect(xqj,&XuehuQHTTPJson::readyRead,this,[=](){
       ui->plainTextEdit->appendPlainText(xqj->toString());
    });
*/

class XuehuQHTTPJson : public QObject
{
    Q_OBJECT
public:
    //构造函数
    XuehuQHTTPJson(QObject *parent = nullptr);
    ~XuehuQHTTPJson();

    //清空Json字符串
    void clear();

    //HTTP post & get
    void post(QString addr);
    void get(QString addr);

    //添加值
    void add(QString key, int i);
    void add(QString key, double d);
    void add(QString key, QString s);
    void add(QString key, char* s);
    //添加数组
    void add(QString key, QList<int> i);
    void add(QString key, QList<double> d);
    void add(QString key, QList<QString> s);
    //添加对象
    void add(QString obj_key, QString key, int i);
    void add(QString obj_key, QString key, double d);
    void add(QString obj_key, QString key, QString s);

    //bool值特殊处理
    void addBool(QString obj_key, QString key, bool b);
    void addBool(QString key, bool b);

    //获取值
    QString getQString(QString key);
    double getDouble(QString key);
    int getInt(QString key);
    bool getBool(QString key);

    //获取数组
    QList<QString> getArrQString(QString key);
    QList<int> getArrInt(QString key);
    QList<double> getArrDouble(QString key);
    QStringList getQStringList(QString key){return getArrQString(key);}//获取字符串列表

    //获取对象
    QString getObjQString(QString obj_key, QString key);
    double getObjDouble(QString obj_key, QString key);
    int getObjInt(QString obj_key, QString key);
    bool getObjBool(QString obj_key, QString key);

    //获取Json_raw ==GET
    inline QByteArray toByteArray(){return json_raw;}
    inline QString toString(){return QString(json_raw);}
    //设置RAW ==SET
    inline void setJson(QByteArray ba){json_raw = ba;}
    inline void setJson(QString str){json_raw = str.toUtf8();}


private:
    //获取QJsonDocument
    QJsonDocument getQJDocument();

signals:
    //收到数据之后 触发这个信号
    void readyRead();

private slots:
    void finishedSlot(QNetworkReply *reply);

private:
    QByteArray json_raw;
    QJsonObject add_json;
    QJsonDocument add_docum;
    QMap<QString,QList<QPair<QString,QString> > > add_string_map;

private:
    QNetworkAccessManager *accessManager;
};

#endif // XUEHUQHTTPJSON_H

post和get

void XuehuQHTTPJson::post(QString addr) //发送post请求 默认是json字符串
{
 
    QUrl url(addr);
    QNetworkRequest request(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
    accessManager->post(request, json_raw);

}

void XuehuQHTTPJson::get(QString addr) //发送get请求
{
    QUrl url(addr);
    QNetworkRequest request(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
    accessManager->get(request);
}

添加一个整数

参数是key和要添加的值

void XuehuQHTTPJson::add(QString key, int i)
{
    add_json.insert(key,i);
    add_docum.setObject(add_json);
    json_raw=add_docum.toJson(QJsonDocument::Compact);
}

其他类型同理,重载add函数

获取一个整数

参数是key 返回值是取到的值

int XuehuQHTTPJson::getInt(QString key) //获取int
{
    QJsonDocument doucment = getQJDocument();

    if (doucment.isObject())
    {
        QJsonObject object = doucment.object();
        if (object.contains(key))
        {
            QJsonValue value = object.value(key);
            if (value.isDouble())
            {
                return value.toVariant().toInt();
            }
        }
    }
    return -1;
}

一次请求可以多次get,请求返回的数据会缓存在类里,可以调用clear函数清理

之后添加的东西

  1. 可以添加一些自定义的header,比如token apikey之类的
  2. 不仅有postget 还有put delete等
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐