QHttpServerRouter Class▲
-
Header: QHttpServerRouter
-
Since: Qt 6.4
-
CMake:
find_package(Qt6 REQUIRED COMPONENTS HttpServer)
target_link_libraries(mytarget PRIVATE Qt6::HttpServer)
-
qmake: QT += httpserver
Detailed Description▲
You can register ViewHandler as a callback for requests to a specific URL. Variable parts in the route can be specified by the arguments in ViewHandler.
This is a low-level routing API for an HTTP server.
See the following example:
auto
pageView =
[] (const
quint64 page) {
qDebug() &
lt;&
lt; "page"
&
lt;&
lt; page;
}
;
using
ViewHandler =
decltype
(pageView);
QHttpServerRouter router;
// register callback pageView on request "/page/<number>"
// for example: "/page/10", "/page/15"
router.addRoute&
lt;ViewHandler&
gt;(
new
QHttpServerRouterRule("/page/"
, [=
] (QRegularExpressionMatch &
amp;match,
const
QHttpServerRequest &
amp;,
QTcpSocket *
) {
auto
boundView =
router.bindCaptured(pageView, match);
// it calls pageView
boundView();
}
));
Member Function Documentation▲
QHttpServerRouter::QHttpServerRouter()▲
QHttpServerRouter::~QHttpServerRouter()▲
Destroys a QHttpServerRouter.
bool QHttpServerRouter::addConverter(QAnyStringView regexp)▲
Adds a new converter for type Type matching regular expression regexp, and returns true if this was successful, otherwise returns false.
Automatically try to register an implicit converter from QString to Type. If there is already a converter of type Type, that converter's regexp is replaced with regexp.
struct
CustomArg {
int
data =
10
;
CustomArg() {}
;
CustomArg(const
QString &
amp;urlArg) : data(urlArg.toInt()) {}
}
;
Q_DECLARE_METATYPE(CustomArg);
QHttpServerRouter router;
router.addConverter&
lt;CustomArg&
gt;(u"[+-]?
\\
d+"
));
auto
pageView =
[] (const
CustomArg &
amp;customArg) {
qDebug("data: %d"
, customArg.data);
}
;
using
ViewHandler =
decltype
(pageView);
auto
rule =
std::
make_unique&
lt;QHttpServerRouterRule&
gt;(
"/<arg>/<arg>/log"
,
[&
amp;router, &
amp;pageView] (QRegularExpressionMatch &
amp;match,
const
QHttpServerRequest &
amp;request,
QTcpSocket *
socket) {
// Bind and call viewHandler with match's captured string and quint32:
router.bindCaptured(pageView, match)();
}
);
router.addRule&
lt;ViewHandler&
gt;(std::
move(rule));
void QHttpServerRouter::addConverter(QMetaType metaType, QAnyStringView regexp)▲
Adds a new converter for type metaType matching regular expression regexp.
If there is already a converter of type metaType, that converter's regexp is replaced with regexp.
bool QHttpServerRouter::addRule(std::unique_ptr<QHttpServerRouterRule> rule)▲
Adds a new rule and returns true if this was successful.
Inside addRule, we determine ViewHandler arguments and generate a list of their QMetaType::Type ids. Then we parse the URL and replace each <arg> with a regexp for its type from the list.
QHttpServerRouter router;
using
ViewHandler =
decltype
([] (const
QString &
amp;page, const
quint32 num) {
}
);
auto
rule =
std::
make_unique&
lt;QHttpServerRouterRule&
gt;(
"/<arg>/<arg>/log"
,
[] (QRegularExpressionMatch &
amp;match,
const
QHttpServerRequest &
amp;request,
QTcpSocket *
socket) {
}
);
router.addRule&
lt;ViewHandler&
gt;(std::
move(rule));
typename ViewTraits::BindableType QHttpServerRouter::bindCaptured(ViewHandler &&handler, const QRegularExpressionMatch &match) const▲
Supplies the handler with arguments derived from a URL. Returns the bound function that accepts whatever remaining arguments the handler may take, supplying them to the handler after the URL-derived values. Each match of the regex applied to the URL (as a string) is converted to the type of the handler's parameter at its position, so that it can be passed as match.
QHttpServerRouter router;
auto
pageView =
[] (const
QString &
amp;page, const
quint32 num) {
qDebug("page: %s, num: %d"
, qPrintable(page), num);
}
;
using
ViewHandler =
decltype
(pageView);
auto
rule =
std::
make_unique&
lt;QHttpServerRouterRule&
gt;(
"/<arg>/<arg>/log"
,
[&
amp;router, &
amp;pageView] (QRegularExpressionMatch &
amp;match,
const
QHttpServerRequest &
amp;request,
QTcpSocket *
socket) {
// Bind and call viewHandler with match's captured string and quint32:
router.bindCaptured(pageView, match)();
}
);
router.addRule&
lt;ViewHandler&
gt;(std::
move(rule));
void QHttpServerRouter::clearConverters()▲
Removes all converters.
clearConverters() does not set up default converters.
See Also▲
See also converters()
const QHash<QMetaType, QString> &QHttpServerRouter::converters() const▲
Returns a map of converter type and regexp.
The following converters are available by default:
Constant |
|
---|---|
QMetaType::Int |
|
QMetaType::Long |
|
QMetaType::LongLong |
|
QMetaType::Short |
|
QMetaType::UInt |
|
QMetaType::ULong |
|
QMetaType::ULongLong |
|
QMetaType::UShort |
|
QMetaType::Double |
|
QMetaType::Float |
|
QMetaType::QString |
|
QMetaType::QByteArray |
|
QMetaType::QUrl |
|
QMetaType::Void |
An empty converter. |
void QHttpServerRouter::removeConverter(QMetaType metaType)▲
Removes the converter for type metaType.