1. 程式人生 > >Qt中簡單使用Firebase

Qt中簡單使用Firebase

                     

上一篇對Firebase進行了簡要的介紹。

今天對Firebase進行簡單的應用。在qt中,因為我不會Android和ios開發。

最主要的就是寫一個類,Firebase.

直接程式碼: firebase.h

#ifndef FIREBASE_H#define FIREBASE_H#include <QObject>#include <QtNetwork/QNetworkAccessManager>#include <QtNetwork/QNetworkReply>#include <QtNetwork/QNetworkRequest>#include <QUrl>
#include <QUrlQuery>#include <QDebug>#include <QtGlobal>#include <datasnapshot.h>class Firebase : public QObject{    Q_OBJECTpublic:    explicit Firebase(QObject *parent = 0);    Firebase(QString hostName,QString child);    Firebase(QString hostName);    void init();    void setValue(QString str);    void
getValue();    void deleteValue();    void setToken(QString);    void listenEvents();    Firebase* child(QString childName);signals:    void eventResponseReady(QString);    void eventDataChanged(DataSnapshot*);public slots:    void replyFinished(QNetworkReply*);    void onReadyRead(QNetworkReply*);    void
eventFinished();    void eventReadyRead();private:    QString host;    QString firebaseToken="";    QNetworkAccessManager *manager;    QString currentNode;    QString latestNode;    QString buildPath(int);    QString createJson(QString);    void open(const QUrl &url);    QByteArray trimValue(const QByteArray &line) const;};#endif // FIREBASE_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

firebase.cc

#include "firebase.h"#include <string.h>#include <QIODevice>#include <QBuffer>#include <QJsonDocument>#include <datasnapshot.h>Firebase::Firebase(QObject *parent) :    QObject(parent){}void Firebase::init(){    manager=new QNetworkAccessManager(this);    connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));}Firebase::Firebase(QString hostName){    host=hostName;    currentNode="";    init();}void Firebase::setToken(QString token){    firebaseToken=token;}Firebase::Firebase(QString hostName,QString child){    host=hostName            .append(child).append("/");    latestNode=child;    init();}Firebase* Firebase::child(QString childName){    Firebase *childNode=new Firebase(host,childName);    childNode->setToken(firebaseToken);    return childNode;}void Firebase::open(const QUrl &url){    QNetworkRequest request(url);    request.setRawHeader("Accept",                         "text/event-stream");    QNetworkReply *_reply = manager->get(request);    connect(_reply, &QNetworkReply::readyRead, this, &Firebase::eventReadyRead);    connect(_reply, &QNetworkReply::finished, this, &Firebase::eventFinished);}void Firebase::eventFinished(){    QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());    if (reply)    {        QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();        if (!redirectUrl.isEmpty())        {            reply->deleteLater();            open(redirectUrl);            return;        }        reply->deleteLater();    }}void Firebase::eventReadyRead(){    QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());    if(reply)    {        QByteArray line=reply->readLine();        if(!line.isEmpty())        {            QByteArray eventName=trimValue(line);            line=reply->readAll();            if(eventName=="put")            {                DataSnapshot *dataSnapshot=new DataSnapshot(line);                emit eventDataChanged(dataSnapshot);            }        }    }    reply->readAll();}void Firebase::onReadyRead(QNetworkReply *reply){    /*qDebug()<<"incoming data";    qDebug()<<reply->readAll();*/}void Firebase::replyFinished(QNetworkReply *reply){    //qDebug()<<reply->readAll();    QString data=QString(reply->readAll());    emit eventResponseReady(data);}void Firebase::setValue(QString strVal){    //Json data creation    QNetworkRequest request(buildPath(1));    request.setHeader(QNetworkRequest::ContentTypeHeader,                      "application/x-www-form-urlencoded");    QBuffer *buffer=new QBuffer();    buffer->open((QBuffer::ReadWrite));    buffer->write(createJson(strVal).toUtf8());    buffer->seek(0);    /*     * To be able to send "PATCH" request sendCustomRequest method is used.     * sendCustomRequest requires a QIOdevice so QBuffer is used.     * I had to seek 0 because it starts reading where it paused.     */    manager->sendCustomRequest(request,"PATCH",buffer);    buffer->close();}void Firebase::getValue(){    QNetworkRequest request(buildPath(0));    manager->get(request);}void Firebase::listenEvents(){    open(buildPath(0));}void Firebase::deleteValue(){    QNetworkRequest request(buildPath(0));    manager->deleteResource(request);}QString Firebase::createJson(QString str){    QString data=QString(QString("{").append("\"").append(latestNode).append("\"").append(":").append("\"").append(str).append("\"").append(QString("}")));    return data;}QString Firebase::buildPath(int mode){    QString destination="";    if(mode)    {        host.replace(QString("/").append(latestNode).append("/"),"");        destination                .append(host)                .append("/.json");    }    else    {        destination                .append(host)                .append(currentNode)                .append(".json");    }    if(!firebaseToken.isEmpty())        destination.append("?auth=").append(firebaseToken);    //根據你的實際情況,寫destination    return destination;}QByteArray Firebase::trimValue(const QByteArray &line) const{    QByteArray value;    int index = line.indexOf(':');    if (index > 0)        value = line.right(line.size() - index  - 1);    return value.trimmed();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164