QtHttpServer
它可以配合js库中的socket.io完成轮训或websocket切换,通过http访问后使用websocket实现双向通信, 笔者是在改造h5+node.js项目时,因为裁剪的arrch64板子中的node.js写的服务端依赖的几个第三库库编译不过去,所以决定替换服务端, 用熟悉的 Qt 写 .
下载
GitHub:下载QtHttpServer源码:https://github.com/qt-labs/qthttpserver
GitHub:下载第三方依赖http-parser源码:https://github.com/nodejs/http-parser
第三方依赖放入指定位置
编译
使用Qt Creator 打开使用 msvc 2015-x64bit 编译
找不到头文件
可以发现,qsslserver 与 qsslserver_p.h是在相对路径下,修改一下
其他这种无法打开包括文件: “private/qsslserver_p.h”: No such file or directory的错误都这样修改.
无法打开包括文件: “QtSslServer/QtSslServer”: No such file or directory
..\..\include\QtHttpServer\QtHttpServerDepends(6): fatal error C1083:
无法打开包括文件: “QtSslServer/QtSslServer”: No such file or directory
注意看路径是include\QtHttpServer\QtHttpServerDepends,那么打开
以下是漫长的修改 <QtHttpServer/xxxx.h> -> “xxxx.h”
中间优先处理找不到头文件错误,解决一波重编译一次
QLatin1Char 报错
Qt5.12.x以下版本会出现的问题
“compare” 不是 “QByteArray” 的成员
莫慌,看下源码它是怎么实现的
可以通过改造未下面的代码,兼容Qt5.12.x以下版本
int QHttpServerRequestPrivate::onHeaderValue(http_parser *httpParser, const char *at, size_t length)
{
qCDebug(lc) << httpParser << QString::fromUtf8(at, int(length));
auto i = instance(httpParser);
i->state = State::OnHeaders;
Q_ASSERT(!i->lastHeader.isEmpty());
const auto value = QByteArray(at, int(length));
i->headers[i->headerHash(i->lastHeader)] = qMakePair(i->lastHeader, value);
#if QT_VERSION >= QT_VERSION_CHECK(5,12,0)
if (i->lastHeader.compare(QByteArrayLiteral("host"), Qt::CaseInsensitive) == 0)
parseUrl(at, length, true, &i->url);
#else
if(i->lastHeader.contains(QByteArrayLiteral("host"))){
parseUrl(at, length, true, &i->url);
}
#endif
#if defined(QT_DEBUG)
i->lastHeader.clear();
#endif
return 0;
}
“isEmpty” 不是 “QLatin1String” 的成员
切换到Qt5.12.x看下它的实现
直接修改
if(!it->size()) // if (it->isEmpty())
continue;
“xxx” 不是 “QFlags” 的成员
完美成功
使用
讲它的路由用法
QtHttpServer routing API:https://www.qt.io/cn/blog/2019/05/28/qhttpserver-routing-api
下载示例源码
例子已经过 Qt5.12.12 + vs2017, Qt5.12.12+minGW 测试
源码下载:https://download.csdn.net/download/u012020854/85142696
直接双击 /bin/release/mingw_x64/YeHaiHttp.exe