之前使用c++开发的程序都是使用curl库进行各种http操作。

qt为我们继承了一些网络操作的类,因此不需要第三方库的支持了。今天就跟大家分享一下qt中对http请求的封装。

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

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

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

这里不再过多的介绍上面三个类,因为qt的文档描述的非常非常的清楚。

开始写我们自己的http api:

写一个基类,命名为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_OBJECTpublic: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 anymorereply->deleteLater();
}

解释:
1 使用了qt中的QSettings,就是一个存储功能
The QSettings class provides persistent platform-independent application settings
http://doc.qt.io/qt-4.8/qsettings.html

2 声明了一个纯虚函数,使得子类根据自己的情况进行重写

基类就这样写完了,下面写一个应用,比如从服务器请求游戏列表:
写一个子类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}});

Qt--Http请求封装(Get Post)相关推荐

  1. 小程序仿 axios 请求封装

    一.新建request.js /** 功能:小程序仿 axios 的请求封装*/ export default class Request {// 配置项configure = {baseURL: ' ...

  2. uni-app 请求封装

    uni-app 请求封装 请求封装 // 默认配置 const instanceConfig = {baseURL: '',header: {'content-type': 'application/ ...

  3. ios 请求失败封装_vue_axios请求封装、异常拦截统一处理

    1.前端网络请求封装.异常统一处理 vue中采用axios处理网络请求,避免请求接口重复代码,以及各种网络情况造成的异常情况的判断,采用axios请求封装和异常拦截操作: axios 请求封装 // ...

  4. vue请求封装,http-接口部分(文档笔记)

    http-接口 目录结构 . ├── src 源码目录 │ ├── http 请求封装 │ │ ├── modules 请求所属模块 │ │ │ ├── example.js example模块请求 ...

  5. vue_axios请求封装、异常拦截统一处理

    1.前端网络请求封装.异常统一处理 vue中采用axios处理网络请求,避免请求接口重复代码,以及各种网络情况造成的异常情况的判断,采用axios请求封装和异常拦截操作: axios 请求封装 // ...

  6. Python接口自动化之requests请求封装

    ------·今天距2021年253天·------ 这是ITester软件测试小栈第114次推文 在上一篇Python接口自动化测试系列文章:Python接口自动化之Token详解及应用,介绍tok ...

  7. Spring Boot + Vue 前后端分离开发,前端网络请求封装与配置

    前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources,Vue2.0 之后,官方不再建议使用 vue-resources ,这个 ...

  8. 【 微信小程序请求封装】【进阶版】处理401请求token过期--重新登录--重新发起刚才过期的请求

    微信小程序请求封装(拦截器):处理请求过期–重新登录–重新发起刚才过期的请求 env.js //这里使用的接口呢都是自己模拟的,可以根据自己的需求进行添加module.exports={//开发环境的 ...

  9. 微信小程序登录及请求封装

    整合了获取用户信息/用户手机号/及请求封装 粘贴即用 目录结构 app.js //app.js // const util = require('/utils/util.js') // import ...

  10. FFmpeg开发(五)——Qt视频播放器之封装FFmpeg类(参考了暴风影音、迅雷影音)

    FFmpeg开发(五)--Qt视频播放器之封装FFmpeg类(参考了暴风影音.迅雷影音) 上一篇介绍了,使用Qt和FFmpeg写的播放器.页面大家可以点进去查看和下载. FFmpeg开发(四)--Qt ...

最新文章

  1. 条件随机场(CRF) - 4 - 学习方法和预测算法(维特比算法)
  2. [微信小程序]手指触摸动画效果(完整代码附效果图)
  3. Xcode SVN配置
  4. Linux Kernel TCP/IP Stack — 网卡监控
  5. winsock setsockopt 详解
  6. php 一行代码解决二维数组去重
  7. Gallery的使用(一)
  8. html页面显示html代码怎么写,求助这段代码如何转换成正常可看的HTML页面
  9. vsftp建立虚拟用户不同目录分配不同权限操作步骤详解
  10. SDOI2005 区间
  11. 2012网页设计趋势(下)
  12. javascript教程_JavaScript教程
  13. JS DOM操作基础
  14. 学C++不得不看的一篇文章
  15. 关于Python中的classmethod
  16. 【CPU微架构】分支预测(二)常用分支预测算法
  17. 网站出现安全证书过期的原因
  18. 【IoT-卫朋】智能硬件 | 产品按键设计
  19. linux下截图软件,Flameshot - Linux下功能强大的屏幕截图软件
  20. 图像重采样/插值原理与其在MRI脑影像分辨率修改中的应用——将尺寸为1mm标准模板修改成体素尺寸为3、6、8mm标准模板(FSL、SPM12、NIfTI_20140122、dpabi、nilearn)

热门文章

  1. 数值计算---求希尔伯特矩阵的条件数
  2. Pythom模块之random模块
  3. 开源Futter项目
  4. CSDN下载积分最新情况
  5. python批量提取word文档中的图片(含图片格式转换和GUI)
  6. 【UE4 第一人称射击游戏】47-修改AI为僵尸样貌
  7. 蓝牙耳机什么牌子便宜又好用?好用的国产蓝牙耳机推荐
  8. 给ChatGPT喂黑话学得贼快,网友:你把AI教恶心了我们还怎么玩?
  9. 漫画 | 硬盘装满电影后会变重吗?
  10. 安卓之百度地图实现位置定位