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 로 전달됩니다. 서버는 URL 경로와 HTTP 메서드를 기반으로 등록된 규칙에 따라 들어오는 HTTP 요청을 일치시키고 두 가지 중 가장 먼저 일치하는 것이 실행됩니다.
pathPattern 매개변수는 들어오는 요청 URL의 path()과 비교됩니다. method 매개변수는 들어오는 요청의 HTTP 메서드와 비교됩니다. slot 매개 변수는 요청 핸들러입니다. context 의 멤버 함수 포인터, 함수 포인터, 변경 불가능한 람다 또는 const 호출 연산자를 사용하여 복사 가능한 호출 가능 항목일 수 있습니다. context 을 제공하면 컨텍스트가 존재하는 한 규칙은 유효합니다. context 은 QHttpServer 과 동일한 스레드 선호도를 공유해야 합니다.
slot 은 "<arg>" 자리 표시자를 일치시켜 pathPattern 에서 추출한 파싱된 인수를 인자로 받고, 그 뒤에 선택적 QHttpServerRequest 과 선택적 QHttpServerResponder 을 인자로 받습니다. 이 두 클래스를 특수라고 합니다.
slot 는 QHttpServerResponse 또는 변환 가능한 유형을 반환할 수 있습니다:
QHttpServer server; server.route("/test/", this, [] () { return ""; });
참고: 이 함수인 route()는 slot 에서 호출해서는 안 되므로 다른 라우트 핸들러는 다른 라우트 핸들러를 등록할 수 없습니다.
또는 선택적 QHttpServerResponder 인수가 제공되면 이를 사용하여 응답을 작성해야 하며 함수는 void 또는 QFuture<void>를 반환해야 합니다. QFuture<void> 지원은 Qt 6.11에 추가되었습니다. QHttpServerResponder 는 복사할 수 없으며, QFuture<void>를 반환할 때를 제외하고 참조 또는 rvalue 참조로 전달할 수 있지만, 이 경우 범위를 벗어나는 것을 방지하기 위해 rvalue 참조로 전달해야 합니다.
server.route("/test2", this, [] (QHttpServerResponder &&responder) { responder.write(QHttpServerResponder::StatusCode::Forbidden); });
참고: QHttpServerResponder 을 인수로 받아들이는 slot 에 의해 요청이 처리된 경우, 이후 요청 핸들러( addAfterRequestHandler 참조)는 호출되지 않습니다.
또한 QHttpServerRequest 을 마지막 인자로 사용하거나 QHttpServerResponder 인수가 있는 경우 요청의 자세한 정보를 얻기 위해 두 번째에서 마지막 인자로 사용할 수 있습니다. 이 인수는 상수 참조(비동시 콜백의 경우에만) 또는 값으로 전달할 수 있으며 요청의 본문에 액세스하는 데 사용할 수 있습니다:
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); });
이 함수는 성공하면 새로 생성된 규칙에 대한 포인터를 반환하고, 그렇지 않으면 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)
pathPattern 및 QHttpServerRequest::Method::AnyKnown 에 대한 규칙을 생성하기 위해 QHttpServer::route 의 과부하. 모든 요청은 함수 포인터, 변경 불가능한 람다 또는 const 호출 연산자를 사용하는 기타 복사 가능한 호출 가능 항목이 될 수 있는 handler 으로 전달됩니다. 이 규칙은 QHttpServer 이 파괴될 때까지 유효합니다.
이 함수는 오버로드된 함수입니다.
template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, QHttpServerRequest::Methods method, Functor &&handler)
pathPattern 및 method 에 대한 규칙을 생성하기 위해 QHttpServer::route 의 과부하. 모든 요청은 함수 포인터, 변경 불가능한 람다 또는 const 호출 연산자를 사용하는 기타 복사 가능한 호출 가능 항목이 될 수 있는 handler 으로 전달됩니다. 이 규칙은 QHttpServer 이 파괴될 때까지 유효합니다.
이 함수는 오버로드된 함수입니다.
template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, const QObject *context, Functor &&slot)
pathPattern 에 대한 규칙을 생성하기 위해 QHttpServer::route 의 과부하와 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.