Serveur HTTP simple

Exemple simple de mise en place d'un serveur HTTP.

Sortie d'un serveur HTTP simple dans un navigateur

Le serveur HTTP simple montre comment configurer un serveur HTTP à l'aide de la classe QHttpServer. Il écoute deux sockets : un socket TCP et un socket SSL. Différents rappels sont mis en place pour montrer comment utiliser la fonction route().

Un objet QHttpServer est créé et un simple route() gère le chemin "/" en renvoyant Hello world:

QCoreApplication app(argc, argv);

QHttpServer httpServer;
httpServer.route("/", []() {
    return "Hello world";
});

Nous enregistrons ensuite un rappel qui sert les ressources du serveur au client :

httpServer.route("/assets/<arg>", [] (const QUrl &url) {
    return QHttpServerResponse::fromFile(u":/assets/"_s + url.path());
});

Ici, nous utilisons l'objet QHttpServerRequest pour renvoyer l'adresse IP du client :

httpServer.route("/remote_address", [](const QHttpServerRequest &request) {
    return request.remoteAddress().toString();
});

Pour l'un des chemins, "/auth", l'authentification HTTP de base est utilisée :

httpServer.route("/auth", [](const QHttpServerRequest &request) {
    auto auth = request.value("authorization").simplified();

    if (auth.size() > 6 && auth.first(6).toLower() == "basic ") {
        auto token = auth.sliced(6);
        auto userPass = QByteArray::fromBase64(token);

        if (auto colon = userPass.indexOf(':'); colon > 0) {
            auto userId = userPass.first(colon);
            auto password = userPass.sliced(colon + 1);

            if (userId == "Aladdin" && password == "open sesame")
                return QHttpServerResponse("text/plain", "Success\n");
        }
    }
    QHttpServerResponse resp("text/plain", "Authentication required\n",
                             QHttpServerResponse::StatusCode::Unauthorized);
    auto h = resp.headers();
    h.append(QHttpHeaders::WellKnownHeader::WWWAuthenticate,
             R"(Basic realm="Simple example", charset="UTF-8")");
    resp.setHeaders(std::move(h));
    return std::move(resp);
});

Nous utilisons ensuite la fonction addAfterRequestHandler() pour modifier l'objet QHttpServerResponse après qu'il a été traité par les rappels enregistrés par route() en ajoutant des en-têtes HTTP à la réponse :

httpServer.addAfterRequestHandler(&httpServer, [](const QHttpServerRequest &, QHttpServerResponse &resp) {
    auto h = resp.headers();
    h.append(QHttpHeaders::WellKnownHeader::Server, "Qt HTTP Server");
    resp.setHeaders(std::move(h));
});

Un QTcpServer écoutant un port est lié au serveur HTTP à l'aide de la fonction bind() :

auto tcpserver = std::make_unique<QTcpServer>() ;if (!tcpserver->listen() || !httpServer.bind(tcpserver.get())) {    qWarning() << QCoreApplication::translate("QHttpServerExample",
                                             "Server failed to listen on a port.") ; return-1; }quint16 port =  tcpserver->serverPort() ; tcpserver.release() ;

Ensuite, QSslConfiguration est utilisé pour créer une configuration SSL pour QHttpServer afin de servir le trafic HTTPS :

QSslConfiguration conf = QSslConfiguration::defaultConfiguration() ;const auto sslCertificateChain =QSslCertificate::fromPath(QStringLiteral(":/assets/certificate.crt")) ;if (sslCertificateChain.empty()) {    qWarning() << QCoreApplication::translate("QHttpServerExample",
                                             "Couldn't retrieve SSL certificate from file.") ; return-1; }QFile privateKeyFile(QStringLiteral(":/assets/private.key")) ;if (!privateKeyFile.open(QIODevice::ReadOnly)) {    qWarning() << QCoreApplication::translate("QHttpServerExample",
                                             "Couldn't open file for reading : %1") . arg(privateKeyFile.errorString()) ; return-1; } conf.setLocalCertificate(sslCertificateChain.front()) ; conf.setPrivateKey(QSslKey(&privateKeyFile, QSsl::Rsa)) ; conf.setAllowedNextProtocols({ QSslConfiguration::ALPNProtocolHTTP2 }) ; // Ajout du support HTTP/2privateKeyFile.close() ;auto sslserver = std::make_unique<QSslServer>() ;  sslserver->setSslConfiguration(conf) ;if (!sslserver->listen() || !httpServer.bind(sslserver.get())) {    qWarning() << QCoreApplication::translate("QHttpServerExample",
                                             "Server failed to listen on a port.") ; return-1; }quint16 sslPort =  sslserver->serverPort() ; sslserver.release() ;

Une fois que tout est mis en place, il ne reste plus qu'à commencer à traiter les requêtes entrantes :

return app.exec();

Fichiers :

Images :

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.