Qt httpserver 理解与使用
目录
概述
核心概念-路由
多线程处理
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 理解与使用相关推荐
- Qt::WA_OpaquePaintEvent理解
Qt助手中对Qt::WA_OpaquePaintEvent解释如下: Indicates that the widget paints all its pixels when it receives ...
- qt信号量理解及使用
信号量可以理解为互斥量的延伸或者说是互斥量的泛化,一个互斥量只能锁一次,但信号量则可以获取多次,信号量经常在多线程或多进程中用来保护一定数量的共享资源,线程必须要获取一个信号量,举个例子: 有一个餐馆 ...
- Qt::WindowType、Qt::WidgetAttribute各个标志含义汇总
Qt::WindowType标志通过如下函数设置: setWindowFlag 或 setWindowFlags 注意:这两个函数的区别是:不加s的每次只能设置一个Qt::WindowType标志位, ...
- qtabwidget放大_Qt自定义弹窗屏蔽父窗口(QWidget设置setWindowModality(Qt::ApplicationModal);以后再show)...
写Qt程序时遇到一个问题: Qt自带的弹窗功能单一,所以须要自己用ui设计弹窗的内容,这样弹窗就和普通窗口一样了,但问题是这个弹窗显示后父窗口还是活动的.网上找了很久找到了解决办法: Qt::Wind ...
- Qt网络编程:QNetworkProxy
一.描述 QNetworkProxy 提供了为 Qt 网络类配置网络层代理支持的方法.当前支持的类有 QAbstractSocket.QTcpSocket.QUdpSocket.QTcpServer. ...
- Qt5学习笔记之bin文件合成工具一:使用对话框选取本地文件并读取
这里写目录标题 概述 工具概述 实现步骤 本章总结 概述 经过了前面的QQ登录界面和串口助手,我们已经对QT有了一个初步的认识.视频后半部分是网络和移植部分,打算先不继续学习,在Windows下实现两 ...
- 暑假规划及小学期总结
总结 三个周小学期过去了(- - 妈蛋怎么有种写小学生日记的感觉),完成了两个项目,一个飞机大战,一个QT下编程. 飞机大战的编写过程真是日了狗了,以前学C++,吴振寰上课讲了一点MFC,让回来写程序 ...
- 线性代数学习笔记8-2:对称矩阵和Hermitian矩阵、共轭转置、正定矩阵
对称矩阵特征值为实数并且拥有一套正交特征向量,正定矩阵的性质则更好. 对称矩阵 Symmetric matrices 对称矩阵: 实矩阵 A \mathbf A A满足 A = A T \mathbf ...
- 详解从0开始的嵌入式学习路线,学什么、怎么学?
嵌入式是个大筐,什么都可以往里面装,电子.机械.计算机.自动化.测控.通信.物联网--很多很多专业都和嵌入式沾边,硬件.驱动.操作系统.网络.应用.算法--很多同学越学越迷糊,越学越感觉什么也不会. ...
最新文章
- 平面广告设计和Web设计的差别
- linux ssh 下实现免密码登录
- 【干货】张小龙演讲PPT:APP产品经理必须要懂的30条原则
- java对象复制到另一个对象中_spring: beanutils.copyproperties将一个对象的数据塞入到另一个对象中(合并对象)...
- zhuan zai suffix tree
- FFmpeg 音视频同步
- Git-分布式版本控制系统
- 一个银行客户经理的“变形记”
- 计算机教师专业知识,小学信息技术教师专业知识考试复习题及答案【精选】.doc...
- 重新认识HTML中的p标签
- 拓端tecdat|R语言神经网络模型预测车辆数量时间序列
- 二元线性回归最小二乘法公式推导
- 表格序号_Word办公技巧:如何为文档中的表格添加居中对齐的自动序号?
- 借助 PowerVR 开发工具,让 iOS 应用在苹果 M1 电脑上实现更好体验
- IOI2022 D2T1 数字电路(计数概率/组合数学+线段树区间翻转)
- 计算机网络时代纪录片,中国首部自媒体纪录片《生机》揭秘新世相
- 【python】自动登录51cto家园
- 身份证号码的规则及验证原理
- 王者荣耀 是什么语言编写的
- Qt扫盲-网络编程概述