Bootstrap

基于QT的QtHttpServer轻量级服务器+QtHttpServer的使用

QtHttpServer是一个轻量级服务器。由于本人编译源码不成功,直接从网上找到已经编译好的代码,直接编译可得到QtHttpServer的相关库。

下面介绍一下QtHttpServer的使用。

QtHttpServer的使用

创建路由的格式:lambda表达式

httpserver.route(路由地址字符串,方法类型,[](){});

方法类型主要用的包括QHttpServerRequest::Method::POST和QHttpServerRequest::Method::GET

QHttpServerRequest类可以用来接收请求发送过来的消息,函数方法:request.body()获取请求数据,接收到的数据类型为QByteArray字节数组。

QHttpServerResponder类用来返回响应的数据。写入反应数据方法如下:

void write(QIODevice *data,HeaderList headers,StatusCode status = StatusCode::Ok);    
void write(QIODevice *data,const QByteArray &mimeType,StatusCode status = StatusCode::Ok);
void write(const QJsonDocument &document,HeaderList headers,StatusCode status = StatusCode::Ok);
void write(const QJsonDocument &document,StatusCode status = StatusCode::Ok);
void write(const QByteArray &data,HeaderList headers,StatusCode status = StatusCode::Ok);
void write(const QByteArray &data,const QByteArray &mimeType,StatusCode status = StatusCode::Ok);
void write(HeaderList headers, StatusCode status = StatusCode::Ok);
void write(StatusCode status = StatusCode::Ok);

void writeHeader(const QByteArray &key, const QByteArray &value);    
void writeHeaders(HeaderList headers);
void writeBody(const char *body, qint64 size);    
void writeBody(const char *body);  
void writeBody(const QByteArray &body);

例子如下:

get请求:

httpserver.route("/api/version", QHttpServerRequest::Method::GET, [] (QHttpServerResponder &&responder) {
        QString str = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
        QJsonObject dataObj;
        dataObj.insert("version","3.0.0");
        dataObj.insert("dateTime",str);
        QJsonDocument recordJsonDocument(dataObj);
        responder.write(recordJsonDocument);

    });

上面的例子中:路由地址为:http://127.0.0.1:1234/api/version

                            请求方法为:get方法

                            参数中:QHttpServerResponder返回响应数据

post请求:

QHttpServer httpserver;
httpserver.route("/api/picture", QHttpServerRequest::Method::POST, [] (const QHttpServerRequest &request,QHttpServerResponder &&responder) {
        //QJsonDocument::fromJson(request.body());

        qDebug()<<QString::fromStdString(request.body().toStdString());
        responder.writeStatusLine(QHttpServerResponder::StatusCode::Ok);
        responder.writeHeader("Content-Type", "image/png");

        QFile file("../untitled54444444444444444444444444444/任嘉伦.png");
        if (!file.open(QIODevice::ReadOnly)||file.size()==0)
        {
            file.close();
            qDebug()<<"打开图片失败";
            return ;
        }
        //写响应头,数据长度,和方法体数据长度一致
        responder.writeHeader("Content-Length", QString::number(file.size()).toUtf8());
        responder.writeBody(file.readAll(), file.size());

    });

上面的例子中:路由地址为:http://127.0.0.1:1234/api/picture

                            请求方法为:post方法

                            参数中:QHttpServerRequest请求类获取请求数据;

                                            QHttpServerResponder返回响应数据

监听

quint16 port = httpserver.listen(QHostAddress::Any,1234);
if (!port)
{
        qDebug()<< QString("error:Http server listen [%1] failed").arg(port);
}

本人整理的QtHttpServer库的编译和QtHttpServer的使用案例:https://download.csdn.net/download/m0_67254672/85906230

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;