目录

概述

核心概念-路由

多线程处理

Qt Https Server


概述

Qt提供了创建简单web服务器的拓展模块,即qthttpserver

关于该模块的一些信息:

Introducing the Qt Http Server

QtHttpServer routing API

该模块的代码位于Qt官方的代码仓库中,但是目前还为正式加入到Qt发行版中,预计Qt6版本会加入该模块。

Qt Project Git Repository Browser

可以看到,存在两个基本相同的代码

qt-extensions/qthttpserver.git - Qt Extension: Qt HTTP Server

qt-labs/qthttpserver.git - Qt HTTP Server

一个归属于Qt扩展模块中,一个归属于Qt实验模块中,尚不清楚具体用意!

核心概念-路由

Qt http server借鉴了现代大多数流行web服务器的概念,最为典型的是Flask。

使用路由技巧,可以方便地处理一个url的请求。一个路由就是一个特定的URL对应的特定规则,也就是执行特定的回调函数!

静态路由:就是将一个固定的URL路径绑定到一个回调函数

一个例子:

QHttpServer server;server.route("/blog/", []() {return "blogs";});

而且,URL路径是严格的,客户端必须按照规定格式去请求才能得到响应。

如:客户请求:127.0.0.1:12345/blog/   能得到响应消息,"blogs"

而请求:127.0.0.1:12345/blog  将拒绝服务。

动态路由就是URL中含有参数,可以动态捕获参数,并将参数转换到程序中需要的类型

如:

server.route( "/blog/" , [] (int year) {return blogs_by_year(year);});

Qt http server对带参数的路由规则做了一些改进。URL中不需要像其他框架那样,明确指明参数类型和参数名,因为在C++中不能将捕获的参数绑定到回调参数中,而且也无法对路径格式类型和回调参数进行编译时检查。我们可以使用静态类型。这样我们就可以将编译器用作为“控制器”,确保我们得到的类型是我们支持的类型。

这样客户端请求时只管传入参数(必须得传入参数),如果类型匹配会自动转换得到参数,否则会转换失败,不执行回调函数,拒绝服务。

如:客户请求:127.0.0.1:12345/blog/   未传入参数,不执行回调函数,无法服务

请求:127.0.0.1:12345/blog/20.21  参数类型有误,不执行回调函数,无法服务

请求:127.0.0.1:12345/blog/2021   参数类型正确,执行回调函数

对于含有多个参数或明确指明参数的情况:

需要使用关键字<arg>。它的工作原理与QString::arg()类似,但不支持排序。

如:

server.route( "/blog/<arg>/<arg>" , [] ( int year, int month) {  // seconnd <arg> is not neccesaryreturn blogs_by_year_and_month(year, month);// return QString("query blogs written in %1, %2").arg(year).arg(month);});server.route( "/blog/<arg>/detail" , [] (int year) {return blogs_by_year(year);});

另外,还支持创建REST API。为此,我们需要拆分GET/POST/PUT/DELETE请求。

如:

server.route( "/blog/" , QHttpServerRequest::Method::GET, [] ( int year) {return blogs_by_year(year);});

这样的话,客户端向该URL发起请求,但是使用POST方法的话,是无法得到响应的。

如果希望自定义HTTP响应的头,则可以使用底层API,QHttpServerResponder。

如:

server.route( "/blog/" , [] ( int year, QHttpServerResponder &&responder) {responder.write(blogs_by_year(year), "text/plain" );});

备注:QHttpServerResponder和QHttpServerRequest是特殊参数,只能用作回调函数的最后一个参数。

多线程处理

最后,提供一个使用多线程处理请求的例子以供参考。这里使用了Qt Concurrent命名空间里的多线程,这是一种高级多线程API,详见 Qt的四种多线程讲解。

server.route("/submitReport", QHttpServerRequest::Method::POST, [this](const QHttpServerRequest &request) -> QHttpServerFutureResponse {auto future = QtConcurrent::run(this, &MyServer::onSubmit, request.body());return future;
});QHttpServerResponse MyServer::onSubmit(const QByteArray &request)
{return QHttpServerResponse(Database::updateSubmit(request));
}

Qt Https Server

Qt http server还支持创建https server,只需要在listen()之前调用sslSetup()进行QSslSocket设置即可。

需要提前使用openssl生成证书和密钥。

一般使用方法如下:

QHttpServer httpsServer;

QSslConfiguration sslConfiguration;

QFile certFile(QStringLiteral(":/cert/localhost.cert"));

QFile keyFile(QStringLiteral(":/cert/localhost.key"));

certFile.open(QIODevice::ReadOnly);

keyFile.open(QIODevice::ReadOnly);

QSslCertificate certificate(&certFile, QSsl::Pem);

QSslKey sslKey(&keyFile, QSsl::Rsa, QSsl::Pem);

certFile.close();

keyFile.close();

sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyNone);

//sslConfiguration.setProtocol(QSsl::TlsV1_0);

sslConfiguration.setLocalCertificate(certificate);

sslConfiguration.setPrivateKey(sslKey);

httpsServer.sslSetup();

httpsServer.listen(QHostAddress::Any, 6666);

通过查看源码,即可明白缘由。

sslSetup()

listen()

Qt httpserver 理解与使用相关推荐

  1. Qt::WA_OpaquePaintEvent理解

    Qt助手中对Qt::WA_OpaquePaintEvent解释如下: Indicates that the widget paints all its pixels when it receives ...

  2. qt信号量理解及使用

    信号量可以理解为互斥量的延伸或者说是互斥量的泛化,一个互斥量只能锁一次,但信号量则可以获取多次,信号量经常在多线程或多进程中用来保护一定数量的共享资源,线程必须要获取一个信号量,举个例子: 有一个餐馆 ...

  3. Qt::WindowType、Qt::WidgetAttribute各个标志含义汇总

    Qt::WindowType标志通过如下函数设置: setWindowFlag 或 setWindowFlags 注意:这两个函数的区别是:不加s的每次只能设置一个Qt::WindowType标志位, ...

  4. qtabwidget放大_Qt自定义弹窗屏蔽父窗口(QWidget设置setWindowModality(Qt::ApplicationModal);以后再show)...

    写Qt程序时遇到一个问题: Qt自带的弹窗功能单一,所以须要自己用ui设计弹窗的内容,这样弹窗就和普通窗口一样了,但问题是这个弹窗显示后父窗口还是活动的.网上找了很久找到了解决办法: Qt::Wind ...

  5. Qt网络编程:QNetworkProxy

    一.描述 QNetworkProxy 提供了为 Qt 网络类配置网络层代理支持的方法.当前支持的类有 QAbstractSocket.QTcpSocket.QUdpSocket.QTcpServer. ...

  6. Qt5学习笔记之bin文件合成工具一:使用对话框选取本地文件并读取

    这里写目录标题 概述 工具概述 实现步骤 本章总结 概述 经过了前面的QQ登录界面和串口助手,我们已经对QT有了一个初步的认识.视频后半部分是网络和移植部分,打算先不继续学习,在Windows下实现两 ...

  7. 暑假规划及小学期总结

    总结 三个周小学期过去了(- - 妈蛋怎么有种写小学生日记的感觉),完成了两个项目,一个飞机大战,一个QT下编程. 飞机大战的编写过程真是日了狗了,以前学C++,吴振寰上课讲了一点MFC,让回来写程序 ...

  8. 线性代数学习笔记8-2:对称矩阵和Hermitian矩阵、共轭转置、正定矩阵

    对称矩阵特征值为实数并且拥有一套正交特征向量,正定矩阵的性质则更好. 对称矩阵 Symmetric matrices 对称矩阵: 实矩阵 A \mathbf A A满足 A = A T \mathbf ...

  9. 详解从0开始的嵌入式学习路线,学什么、怎么学?

    嵌入式是个大筐,什么都可以往里面装,电子.机械.计算机.自动化.测控.通信.物联网--很多很多专业都和嵌入式沾边,硬件.驱动.操作系统.网络.应用.算法--很多同学越学越迷糊,越学越感觉什么也不会. ...

最新文章

  1. 平面广告设计和Web设计的差别
  2. linux ssh 下实现免密码登录
  3. 【干货】张小龙演讲PPT:APP产品经理必须要懂的30条原则
  4. java对象复制到另一个对象中_spring: beanutils.copyproperties将一个对象的数据塞入到另一个对象中(合并对象)...
  5. zhuan zai suffix tree
  6. FFmpeg 音视频同步
  7. Git-分布式版本控制系统
  8. 一个银行客户经理的“变形记”
  9. 计算机教师专业知识,小学信息技术教师专业知识考试复习题及答案【精选】.doc...
  10. 重新认识HTML中的p标签
  11. 拓端tecdat|R语言神经网络模型预测车辆数量时间序列
  12. 二元线性回归最小二乘法公式推导
  13. 表格序号_Word办公技巧:如何为文档中的表格添加居中对齐的自动序号?
  14. 借助 PowerVR 开发工具,让 iOS 应用在苹果 M1 电脑上实现更好体验
  15. IOI2022 D2T1 数字电路(计数概率/组合数学+线段树区间翻转)
  16. 计算机网络时代纪录片,中国首部自媒体纪录片《生机》揭秘新世相
  17. 【python】自动登录51cto家园
  18. 身份证号码的规则及验证原理
  19. 王者荣耀 是什么语言编写的
  20. Qt扫盲-网络编程概述

热门文章

  1. 《有限与无限的游戏》读书笔记
  2. Vue+ElementUI+SpringBoot实现的前后端分离框架
  3. Flutter 倒计时实现
  4. 抖音下播倒计时自动化软件,送礼物自动加时长
  5. TD-问题解答(四)
  6. python安装pandas
  7. bootstrap实现登录注册界面
  8. 电脑如何通过滑动关机?
  9. 局域网雨云蠕虫病毒怎么解决?
  10. python是高级程序语言_高级语言程序设计(Python)_中国大学MOOC(慕课)