QHttpServer Class

QHttpServer는 QAbstractHttpServerQHttpServerRouter 에 대한 간소화된 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)

각 요청이 처리된 후 호출할 contextslot 을 등록하세요.

slotvoid (*)(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>를 반환하는 라우트 핸들러가 처리하는 요청에 대해서만 호출되므로 QHttpServerResponder 인수를 받지 않습니다.

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 요청을 처리할 때 QHttpServerRouter 은 URL 및 HTTP 메서드를 사용하여 들어오는 HTTP 요청에 Rule 을 일치시키고 둘 중 가장 먼저 일치하는 것이 실행됩니다. pathPattern 매개변수는 들어오는 요청 URL의 path()과 비교됩니다. method 매개변수는 들어오는 요청의 HTTP 메서드와 비교됩니다.

slot 매개변수는 context 의 멤버 함수 포인터일 수 있습니다. 또한 함수 포인터, 변경 불가능한 람다 또는 const 호출 연산자를 사용하여 복사 가능한 기타 호출 가능할 수 있습니다. 규칙은 context 의 수명 기간 동안 유효합니다. contextQHttpServer 과 동일한 스레드 선호도를 공유해야 등록에 성공하고 규칙이 실행될 수 있습니다.

슬롯은 반환 문으로 응답을 표현할 수 있습니다. 이 경우 함수는 QHttpServerResponse 또는 QHttpServerResponse 으로 변환할 수 있는 유형을 반환해야 합니다. 다양한 변환 생성자를 사용할 수 있습니다( QHttpServerResponse 참조).

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

또는 선택적 QHttpServerResponder& 인수를 제공할 수 있으며, 이 경우 응답은 이를 사용하여 작성해야 하고 함수는 void 을 반환해야 합니다.

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

slotconst QHttpServerRequest &를 마지막 매개변수로 사용할 수도 있고, QHttpServerResponder&가 마지막 매개변수인 경우 두 번째에서 마지막 매개변수로 사용할 수도 있습니다. 여기에는 요청에 대한 자세한 정보가 포함됩니다.

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

slotQHttpServerRouter::converters()에서 사용할 수 있는 유형을 가질 수 있는 복사 가능한 매개 변수를 얼마든지 사용할 수도 있습니다. 기본적으로 대부분의 정수형, float, double, QString, QByteArray, QUrl 등이 있습니다. QHttpServerRouter::addConverter ()를 호출하여 추가 유형에 대한 변환기를 추가할 수 있습니다.

pathPattern 에는 왼쪽에서 오른쪽으로 slot 의 매개변수와 일치하는 여러 개의 "<arg>" 하위 문자열이 포함될 수 있습니다. 변환기는 이러한 매개변수의 유형에 따라 선택됩니다.

등록된 각 유형에는 pathPattern 에서 "<arg>" 의 발생을 일치시키고 변환하는 데 사용되는 연관된 정규식이 있습니다. 이러한 정규식 패턴을 결합하여 전체 경로에 대한 구문 분석기를 구성합니다. 그런 다음 결과 구문 분석기를 사용하여 경로가 패턴과 일치하는지 확인합니다. 구문 분석에 성공하면 변환된 매개변수를 사용하여 해당 함수가 호출됩니다. 구문 분석에 실패하면 등록된 다음 콜백이 시도됩니다.

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

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

이 함수는 성공하면 새로 만든 규칙에 대한 포인터를 반환하고, 그렇지 않으면 nullptr. 이 포인터는 사용자 정의 QHttpServerRouter 클래스에서 매개 변수를 설정하는 데 사용할 수 있습니다:

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

참고: 이 함수 route는 slot 에서 호출해서는 안 되므로 다른 라우트 핸들러가 다른 라우트 핸들러를 등록할 수 없습니다.

참고: QHttpServerResponder&을 인수로 받아들이는 slot 에서 요청을 처리한 경우, 이후 요청 핸들러( addAfterRequestHandler 참조)는 호출되지 않습니다.

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

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

QtConcurrent::run()의 람다는 동시에 실행되지만, 모든 네트워크 통신은 QFuture 이 완료된 후 QHttpServer 이 속한 스레드에서 순차적으로 실행됩니다. QHttpServerRequest 객체는 콜백에 대한 참조로 전달된다는 점에 유의하세요. QtConcurrent::run()이 호출되기 전에 필요한 모든 콘텐츠를 추출합니다.

QHttpServerResponder& 특수 인수는 void 을 반환하는 라우트에서만 사용할 수 있습니다. 응답자 객체를 사용하는 경우 응답은 이를 사용하여 반환됩니다.

QHttpServerRouter::addRuleaddAfterRequestHandler참조하십시오 .

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

이것은 과부하된 함수입니다.

pathPatternQHttpServerRequest::Method::AnyKnown 에 대한 규칙을 생성하기 위해 QHttpServer::route 을 오버로드합니다. 모든 요청은 함수 포인터, 변경 불가능한 람다 또는 const 호출 연산자를 사용하여 복사 가능한 기타 호출 가능 함수가 될 수 있는 handler 로 전달됩니다. 이 규칙은 QHttpServer 이 파괴될 때까지 유효합니다.

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

이것은 과부하된 함수입니다.

pathPatternmethod 에 대한 규칙을 생성하기 위해 QHttpServer::route 을 오버로드합니다. 모든 요청은 함수 포인터, 변경 불가능한 람다 또는 const 호출 연산자를 사용하여 복사 가능한 기타 호출 가능 함수가 될 수 있는 handler 로 전달됩니다. 이 규칙은 QHttpServer 이 파괴될 때까지 유효합니다.

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

이것은 과부하된 함수입니다.

pathPattern 에 대한 규칙과 QHttpServerRequest::Method::AnyKnown 메서드를 만드는 QHttpServer::route 의 과부하입니다. 모든 요청은 contextslot 으로 전달됩니다.

QHttpServerRouter *QHttpServer::router()

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

const QHttpServerRouter *QHttpServer::router() const

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

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

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

처리되지 않은 모든 요청은 contextslot 으로 전달됩니다.

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

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

clearMissingHandler참조하세요 .

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