이 페이지에서

QHttpServer Class

QHttpServer는 QAbstractHttpServer 및 QHttpServerRouter 을 위한 간소화된 API입니다. 더 보기...

헤더: #include <QHttpServer>
CMake: find_package(Qt6 REQUIRED COMPONENTS HttpServer)
target_link_libraries(mytarget PRIVATE Qt6::HttpServer)
qmake: QT += httpserver
다음부터: Qt 6.4부터
상속: QAbstractHttpServer

공개 함수

QHttpServer(QObject *parent = nullptr)
virtual ~QHttpServer() override
void addAfterRequestHandler(const QObject *context, Functor &&slot)
void clearMissingHandler()
Rule *route(const QString &pathPattern, QHttpServerRequest::Methods method, const QObject *context, Functor &&slot)
Rule *route(const QString &pathPattern, Functor &&handler)
Rule *route(const QString &pathPattern, QHttpServerRequest::Methods method, Functor &&handler)
Rule *route(const QString &pathPattern, const QObject *context, Functor &&slot)
QHttpServerRouter *router()
const QHttpServerRouter *router() const
void setMissingHandler(const QObject *context, Functor &&slot)

상세 설명

QHttpServer는 다양한 요청 핸들러를 등록하여 간단한 HTTP 서버를 생성하는 데 사용됩니다.

route 함수를 사용하면 서버의 QHttpServerRouter 에 규칙을 편리하게 추가할 수 있습니다. 모든 요청 후 호출되어 응답을 추가로 처리할 핸들러를 등록하려면 addAfterRequestHandler 를 사용하십시오. 단, 이 메커니즘은 QHttpServerResponse 또는 QFuture<QHttpServerResponse>을 반환하는 경로에서만 작동합니다. 처리되지 않은 모든 요청에 대한 핸들러를 등록하려면 setMissingHandler 를 사용하십시오.

최소 예제:

QHttpServer server;

server.route("/", [] () {
    return "hello world";
});

auto tcpserver = new QTcpServer();
if (!tcpserver->listen()|| !server.bind(tcpserver)) {
    delete tcpserver;
    return-1;
}
qDebug() << "Listening on port" << tcpserver->serverPort();

멤버 함수 설명서

[explicit] QHttpServer::QHttpServer(QObject *parent = nullptr)

parent 를 상위 클래스로 하는 QHttpServer 인스턴스를 생성합니다.

[override virtual noexcept] QHttpServer::~QHttpServer()

QHttpServer 를 삭제합니다.

template <typename Functor> void QHttpServer::addAfterRequestHandler(const QObject *context, Functor &&slot)

각 요청이 처리된 후 호출될 ` context `와 ` slot `를 등록합니다.

slot 는 void (*)(const QHttpServerRequest &, QHttpServerResponse &) 시그니처를 구현해야 합니다.

slot 는 함수 포인터, 변경 불가능한 람다식 또는 const 호출 연산자가 있는 복사 가능한 호출 가능 객체일 수도 있습니다. 이 경우 context 는 컨텍스트 객체가 되며, 핸들러는 해당 컨텍스트 객체가 소멸될 때까지 유효합니다.

예시:

server.addAfterRequestHandler(&server, [] (const QHttpServerRequest &req, QHttpServerResponse &resp) {
    auto h = resp.headers();
    h.append(QHttpHeaders::WellKnownHeader::Cookie, "PollyWants=Cracker");
    resp.setHeaders(std::move(h));
}

참고: 이러한 핸들러는 QHttpServerResponse 또는 QFuture<QHttpServerResponse>를 반환하는 경로 핸들러에 의해 처리되는 요청에 대해서만 호출됩니다.

void QHttpServer::clearMissingHandler()

핸들러를 상태 코드 404 Not Found 를 반환하는 기본 핸들러로 재설정합니다.

setMissingHandler도 참조하십시오 .

template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, QHttpServerRequest::Methods method, const QObject *context, Functor &&slot)

이 메서드는 서버의 ` QHttpServerRouter ` 멤버에 새로운 라우팅 ` Rule `을 추가합니다. ` Rule ` 템플릿 매개변수는 ` QHttpServerRouterRule`을 상속받은 모든 클래스일 수 있습니다. 매개변수는 ` Rule`로 전달됩니다. 서버는 들어오는 HTTP 요청을 URL 경로와 HTTP 메서드를 기준으로 등록된 규칙과 대조하며, 두 조건 모두에 가장 먼저 일치하는 규칙이 실행됩니다.

pathPattern slot 매개변수는 들어오는 요청의 URL에 대한 ()과 비교됩니다. 매개변수는 들어오는 요청의 HTTP 메서드와 비교됩니다. ` ` 매개변수는 요청 핸들러입니다. 이는 ` `의 멤버 함수 포인터, 함수 포인터, 변경 불가능한 람다, 또는 `const` 호출 연산자를 갖는 복사 가능한 호출 가능 객체일 수 있습니다. ` `가 제공된 경우, 컨텍스트가 존재하는 한 규칙은 유효한 상태를 유지합니다. ` `는 ` `와 동일한 스레드 친화성을 가져야 합니다. path method context context context QHttpServer

slot 는 pathPattern 에서 "<arg>" 자리 표시자와 일치시켜 추출된 임의의 개수의 구문 분석된 인수를 인수로 받으며, 그 뒤에 선택적인 QHttpServerRequest 와 선택적인 QHttpServerResponder 가 이어집니다. 이 두 클래스는 스페셜(specials)이라고 합니다.

slot 는 QHttpServerResponse 또는 변환 가능한 유형을 반환할 수 있습니다:

QHttpServer server;
server.route("/test/", this, [] () { return ""; });

참고: 이 함수(route())는 경로 핸들러( slot) 내에서 호출되어서는 안 되므로, 어떤 경로 핸들러도 다른 경로 핸들러를 등록할 수 없습니다.

또는, 선택적 QHttpServerResponder 인자가 제공된 경우, 응답은 이를 사용하여 작성되어야 하며 함수는 void 또는 QFuture<void>를 반환해야 합니다. QFuture<VOID> 지원은 Qt 6.11에서 추가되었습니다. ` QHttpServerResponder `는 복사할 수 없으며, 참조 또는 rvalue 참조로 전달될 수 있습니다. 단, ` QFuture` <VOID>를 반환하는 경우에는 범위 밖으로 빠져나가는 것을 방지하기 위해 rvalue 참조로 전달해야 합니다.

server.route("/test2", this,
             [] (QHttpServerResponder &&responder) {
                responder.write(QHttpServerResponder::StatusCode::Forbidden);
             });

참고: QHttpServerResponder 를 인수로 받는 slot 에 의해 요청이 처리된경우 , 요청 후 핸들러( addAfterRequestHandler 참조)는 하나도 호출되지 않습니다.

또한 QHttpServerRequest 는 요청에 대한 상세 정보를 얻기 위해 마지막 인자로 사용되거나, QHttpServerResponder 인자가 있는 경우에서 두 번째 마지막 인자로 사용될 수 있습니다. 이 인자는 const 참조(비동시 콜백의 경우에만 해당) 또는 값으로 전달될 수 있으며, 요청 본문에 접근하는 데 사용될 수 있습니다:

server.route("/test3", QHttpServerRequest::Method::Post, this,
             [] (QHttpServerRequest request, QHttpServerResponder &&responder) {
                responder.write(request.body(), "text/plain"_ba);
             });

pathPattern 내의 모든 자리표시자( "<arg>" )는 핸들러의 인자 유형에 맞게 자동으로 변환됩니다. 지원되는 유형에는 정수, 부동 소수점 숫자, QString, QByteArray 및 QUrl 가 포함됩니다. QUrl 클래스는 pathPattern 의 끝을 처리하기 위해 마지막 매개변수로 사용될 수 있으며, 이를 분할함으로써 임의의 개수의 인자를 지원할 수 있습니다. 사용자 정의 변환기는 QHttpServerRouter::addConverter()를 사용하여 추가할 수 있습니다.

등록된 각 유형에는 pathPattern 내의 자리 표시자를 일치시키고 변환하는 데 사용되는 정규 표현식이 연관되어 있습니다. 이러한 정규 표현식 패턴들은 결합되어 전체 경로를 분석하는 파서를 구성합니다. 이렇게 생성된 파서는 경로가 패턴과 일치하는지 확인하는 데 사용됩니다. 파싱에 성공하면 변환된 매개변수를 사용하여 해당 함수가 호출됩니다. 파싱에 실패하면 다음으로 등록된 콜백이 시도됩니다. 모든 콜백에서 파싱이 실패하면 missingHandler가 호출됩니다.

아래 예제에서, "<arg>" 를 대체하는 요청 경로의 값은 람다 함수가 int 매개변수를 기대하기 때문에 int 로 변환됩니다. HTTP 요청이 경로와 일치하면, 변환된 값이 람다 함수의 page 인자로 전달됩니다:

QHttpServer server;
server.route("/showpage/<arg>", this, [] (int page) { return getPage(page); });

이 함수는 성공 시 새로 생성된 Rule에 대한 포인터를 반환하고, 그렇지 않은 경우 nullptr 를 반환합니다. 이 포인터는 사용자 정의 QHttpServerRouter 클래스의 매개변수를 설정하는 데 사용할 수 있습니다:

auto rule = server.route<MyRule>("/test4", this, [] () {return "";});
rule->setParameter("test");

기본적으로 요청은 ` QHttpServer`의 스레드 내에서 순차적으로 처리됩니다. 동시 처리가 필요한 경우, 요청 핸들러는 ` QFuture<QHttpServerResponse> `를 반환할 수 있습니다:

server.route("/feature/<arg>", [] (int ms) {
    return QtConcurrent::run(pool, [ms] () {
        QThread::msleep(ms);
        return QHttpServerResponse("the future is coming");
    });
});

QtConcurrent::run()의 람다 표현식은 병렬로 실행되지만, 모든 네트워크 통신은 QHttpServer 가 속한 스레드에서 실행됩니다.

퓨처를 반환하는 라우트는 HTTP/2 연결에서만 완전히 병렬로 실행됩니다. 이전 버전의 HTTP는 서로 다른 응답의 일부를 교차 처리하는 것을 지원하지 않습니다. 즉, 응답은 요청이 들어온 순서와 동일한 순서대로 전체가 반환되어야 합니다. 따라서 라우트 핸들러가 QFuture<void>를 반환하더라도, 해당 HTTP/1 연결에서 들어오는 다음 요청은 현재 요청의 처리가 완료될 때까지 처리되지 않습니다. 다만, 서로 다른 연결에 속한 라우트 핸들러들은 병렬로 실행될 수 있습니다.

경로 핸들러가 작업을 병렬로 수행하도록 하면, QHttpServer 가 속한 스레드가 병렬 실행이 수행하는 작업 부담을 덜게 되므로 모든 버전의 HTTP에 이점이 될 수 있습니다.

QHttpServerRequest slot 에 전달된 변수들은 퓨처가 완료되기 전에 범위 밖으로 빠져나갈 수 있으므로, ` `는 복사 가능하며 퓨처를 반환할 때 값으로 캡처되어야 합니다.

server.route("/test4", QHttpServerRequest::Method::Post, this,
             [] (QHttpServerRequest request) {
                return QtConcurrent::run(pool, [request]() {
                    return QHttpServerResponse("text/plain"_ba, request.body());
                }
             });

퓨처를 반환할 때 QHttpServerRequest 또는 QHttpServerResponder 를 참조로 캡처하는 slot 는 금지된 이유에 대한 설명과 함께 어설션을 발생시킵니다.

모든 플랫폼이 QHttpServerResponder 를 QConcurrent::run에 전달되는 가변 람다로 이동하는 것을 지원하는 것은 아니므로, 해결 방법으로는 QHttpServerResponder 를 std::shared_ptr로 이동시킨 후 이를 복사하는 것입니다.

server.route("/concurrent-multipart-back/<arg>",
             [](QString message, QHttpServerResponder &&responder) {
                return QtConcurrent::run(pool,
                    [=, r = std::make_shared<QHttpServerResponder>(std::move(responder))] {
                        QByteArray ba = message.toUtf8();
                        r->writeBeginChunked("text/plain"_ba);
                        for (ushort i = 1; i < 8; ++i) {
                            r->writeChunk(ba);
                        }
                        r->writeEndChunked(ba);
                    });
            });

QHttpServerRouter::addRule 및 addAfterRequestHandler도 참조하십시오 .

template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, Functor &&handler)

` QHttpServer::route `를 오버로드하여 ` pathPattern ` 및 ` QHttpServerRequest::Method::AnyKnown`에 대한 규칙을 생성합니다. 모든 요청은 ` handler`로 전달되며, 이는 함수 포인터, 변경 불가능한 람다, 또는 `const call` 연산자를 갖는 복사 가능한 호출 가능 객체일 수 있습니다. 이 규칙은 ` QHttpServer `가 소멸될 때까지 유효합니다.

이것은 오버로드된 함수입니다.

template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, QHttpServerRequest::Methods method, Functor &&handler)

` QHttpServer::route `를 오버로드하여 ` pathPattern ` 및 ` method`에 대한 규칙을 생성합니다. 모든 요청은 ` handler`로 전달되며, 이 매개변수는 함수 포인터, 변경 불가능한 람다, 또는 `const call` 연산자를 갖는 복사 가능한 호출 가능 객체일 수 있습니다. 이 규칙은 ` QHttpServer `가 소멸될 때까지 유효합니다.

이것은 오버로드된 함수입니다.

template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, const QObject *context, Functor &&slot)

` QHttpServer::route `을 오버로드하여 ` pathPattern `에 대한 규칙을 생성하고, ` QHttpServerRequest::Method::AnyKnown` 메서드를 호출합니다. 모든 요청은 ` context ` 및 ` slot`으로 전달됩니다.

이는 오버로드된 함수입니다.

QHttpServerRouter *QHttpServer::router()

라우터 객체에 대한 포인터를 반환합니다.

const QHttpServerRouter *QHttpServer::router() const

상수 라우터 객체에 대한 포인터를 반환합니다.

template <typename Functor> void QHttpServer::setMissingHandler(const QObject *context, Functor &&slot)

처리되지 않은 요청에 대한 핸들러를 설정합니다.

처리되지 않은 모든 요청은 context 의 slot 로 전달됩니다.

slot 는 void (*)(const QHttpServerRequest &, QHttpServerResponder &) 시그니처를 구현해야 합니다. slot 는 함수 포인터, 변경 불가능한 람다, 또는 const 호출 연산자를 갖는 복사 가능한 호출 가능 객체일 수도 있습니다. 이 경우 context 는 컨텍스트 객체가 됩니다. 핸들러는 컨텍스트 객체가 소멸될 때까지 유효합니다.

기본 핸들러는 상태 404 Not Found 로 응답합니다.

clearMissingHandler도 참조하십시오 .

© 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.