多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

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

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

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

之前使用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 } });
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 久久国内精品视频 | 亚洲精品视频免费观看 | 深夜做爰性大片中文 | 国产精品久久久久一区二区 | 99精品一区二区免费视频 | 好大好湿好硬顶到了好爽在 | 欧美羞羞 | 手机在线色视频 | 网友自拍视频悠悠在线 | 日韩高清一区二区三区五区七区 | 欧美性bbbbxxxxx| 黑人又大又粗好爽好猛视频 | 午夜免费啪啪 | 国产亚洲欧美在线 | 现代激情校园春色 | 国产成人一区二区三区影院免费 | 欧美精品一国产成人性影视 | 最新国产精品精品视频 | 久久这里都是精品 | 秋霞理论福利院 | 精品一区二区三区在线观看 | 国产精品综合一区二区 | 国产精品欧美视频另类专区 | 精品成人免费自拍视频 | 高清一区在线 | 日本69视频 | 自拍自录videosfree自拍自录 | 午夜宅男视频 | 免费叼嘿视频 | 美国毛片网站 | 大黑人xxx | 一区二区三区日韩 | 国产精品免费久久久免费 | 国内精品久久久久影院老司 | 国产精品第一页在线 | 免费观看的黄色网址 | 91久久在线 | 国产高清在线精品免费不卡 | 国产成人永久免费视 | 最近中文字幕2019免费版日本 | 久久国产精品永久免费网站 |