日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Qt--Http請求封裝(Get Post)

Qt--Http請求封裝(Get Post)

來源:程序員人生   發布時間:2016-10-08 15:28:40 閱讀次數:9478次

之前使用c++開發的程序都是使用curl庫進行各種http操作。

qt為我們繼承了1些網絡操作的類,因此不需要第3方庫的支持了。今天就跟大家分享1下qt中對http要求的封裝。

其中用到了:
QNetworkRequest
The QNetworkRequest class holds a request to be sent with QNetworkAccessManager.
http://doc.qt.io/qt⑷.8/qnetworkrequest.html#details

QNetworkAccessManager
The QNetworkAccessManager class allows the application to send network requests and receive replies.
http://doc.qt.io/qt⑸/qnetworkaccessmanager.html#details

QNetworkReply
The QNetworkReply class contains the data and headers for a request sent with QNetworkAccessManager.
http://doc.qt.io/qt⑸/qnetworkreply.html#details

這里不再過量的介紹上面3個類,由于qt的文檔描寫的非常非常的清楚。

開始寫我們自己的http api:

寫1個基類,命名為BaseAPI:
baseapi.h

#ifndef BASEAPI_H #define BASEAPI_H #include <QSettings> #include <QNetworkRequest> #include <QNetworkReply> #include <QNetworkAccessManager> #include "base/constants.h" class BaseAPI : public QObject { Q_OBJECT public: BaseAPI(); ~BaseAPI(); void get(const QString url); void post(const QString url, const QByteArray &data); protected: virtual void requestFinished(QNetworkReply *reply, const QByteArray data, const int statusCode) = 0; public slots: void serviceRequestFinished(QNetworkReply *reply); private: QNetworkRequest httpRequest; QNetworkAccessManager networkAccessManager; QSettings *settings; }; #endif // BASEAPI_H

baseapi.cc

#include "baseapi.h" BaseAPI::BaseAPI() { httpRequest.setRawHeader("Accept", API_ACCEPT); httpRequest.setRawHeader("User-Agent", API_USER_AGENT); httpRequest.setRawHeader("X-XXX-API-Key", API_KEY); httpRequest.setRawHeader("X-XXX-API-Secret", API_SECRET); httpRequest.setRawHeader("Accept-Encoding", "gzip, deflate"); httpRequest.setRawHeader("Content-Type", "application/json"); settings = new QSettings("XXX"); QString id = settings->value(SETTING_ACCOUNT_ID, "").toString(); QString token = settings->value(SETTING_ACCOUNT_TOKEN, "").toString(); if(!id.isEmpty()) { httpRequest.setRawHeader("X-XXX-User-ID", id.toStdString().c_str()); } if (!token.isEmpty()) { httpRequest.setRawHeader("X-XXX-User-Token", token.toStdString().c_str()); } qDebug() << "BaseAPI...id:" << id << " token:" + token; QObject::connect(&networkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*))); } BaseAPI::~BaseAPI() { networkAccessManager.disconnect(); if (settings){ delete settings; settings = nullptr; } } void BaseAPI::get(const QString url) { httpRequest.setUrl(QUrl(url)); networkAccessManager.get(httpRequest); } void BaseAPI::post(const QString url, const QByteArray &data) { httpRequest.setUrl(QUrl(url)); networkAccessManager.post(httpRequest, data); } void BaseAPI::serviceRequestFinished(QNetworkReply *reply) { int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); qDebug() << "BaseAPI...serviceRequestFinished...statusCode:" << statusCode; if(reply->error() == QNetworkReply::NoError) { requestFinished(reply, reply->readAll(), statusCode); } else { requestFinished(reply, "", statusCode); } // At the end of that slot, we won't need it anymore reply->deleteLater(); }

解釋:
1 使用了qt中的QSettings,就是1個存儲功能
The QSettings class provides persistent platform-independent application settings
http://doc.qt.io/qt⑷.8/qsettings.html

2 聲明了1個純虛函數,使得子類根據自己的情況進行重寫

基類就這樣寫完了,下面寫1個利用,比如從服務器要求游戲列表:
寫1個子類GameAPI繼承自BaseAPI:
gameapi.h

#ifndef GAMEAPI #define GAMEAPI #include <functional> #include <QList> #include <QPair> #include "baseapi.h" class GameAPI: public BaseAPI { public: GameAPI(); ~GameAPI(); void getGameList(std::function<void(bool, QList<QPair<QString,QString>>)> callback); protected: void requestFinished(QNetworkReply* reply, const QByteArray data, const int statusCode); private: std::function<void(bool, QList<QPair<QString,QString>>)> checkCallback; }; #endif // GAMEAPI

gameapi.cc

#include "gameapi.h" #include "qdebug.h" #include <QJsonArray> #include <QJsonObject> #include <QJsonDocument> const QString GET_GAME = QString("https://www.xxx.com").append("/apps"); GameAPI::GameAPI() { } GameAPI::~GameAPI() { } void GameAPI::requestFinished(QNetworkReply* reply, const QByteArray data, const int statusCode) { if (statusCode == 200) { QJsonParseError jsonError; QJsonArray json_array = QJsonDocument::fromJson(data, &jsonError).array(); if(jsonError.error == QJsonParseError::NoError) { QList<QPair<QString,QString>> games; for(int i = 0; i < json_array.size(); ++i) { QJsonObject json = json_array.at(i).toObject(); games.append(qMakePair(json.value("key1").toString(), json.value("key2").toString())); } this->checkCallback(true, games); return; } } QList<QPair<QString,QString>> games; this->checkCallback(false, games); } void GameAPI::getGameList(std::function<void(bool, QList<QPair<QString,QString>>)> callback) { this->checkCallback = callback; get(GET_GAME); }

使用接口:

GameAPI game_api = new GameAPI(); game_api->getGameList([&](bool success, QList<QPair<QString,QString>> games){ if (success) { //do something } });
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产高清免费视频 | 国产区一区 | 午夜在线免费观看视频 | 国产资源精品 | 久久91精品 | 精品亚洲一区二区三区 | 国产成人免费看一级大黄 | 国产欧美日韩一区 | 污视频在线观看网站 | 中文字幕亚洲电影 | 国产一区二区三区在线免费 | 欧美日在线观看 | 久久久精品一区二区三区 | 免费观看黄色网 | 国产精品1区 | 精品视频在线看 | 一级毛片一级毛片一级毛片 | 视频在线中文字幕 | 欧美一区二区三区啪啪 | 91深夜福利 | 国产美女久久 | 黄色片免费看 | 色噜噜在线观看 | 欧美日韩国产一区二区三区 | 青青草这里有精品 | 国产成人精品视频 | 91精品国产成人观看 | 性爱视频免费 | 久久精品国产99国产 | 久久久综合| 最近中文文幕天免费 | 久久艹精品 | 欧美一区二区三区白人 | 久久视频国产 | 色婷婷久久久亚洲一区二区三区 | 久久九九久久九九 | 国产成人精品在线 | 黄a视频| 日韩三级网址 | av中文天堂 | 在线观看视频免费播放 |