Newer
Older
WorkCardReader / utils / HttpServer.cpp
tanyue on 18 Jun 2022 2 KB 20220618 界面调整
#include "HttpServer.h"

HttpServer::HttpServer(QObject *parent) : QObject(parent)
{
    httpServer = new QTcpServer(this);
    httpServer->setMaxPendingConnections(1024);
    QObject::connect(httpServer, &QTcpServer::newConnection, this, &HttpServer::newConnection);
}

HttpServer::~HttpServer()
{

}

HttpServer &HttpServer::instance()
{
    static HttpServer obj;
    return obj;
}

bool HttpServer::run(const QHostAddress &address, const quint16 &port)
{
    bool succ = httpServer->listen(QHostAddress::LocalHost, port);
    return succ;
}

void HttpServer::newConnection()
{
    QTcpSocket * m_socket = httpServer->nextPendingConnection();
    QObject::connect(m_socket, &QTcpSocket::readyRead, this, &HttpServer::readyRead);
}

void HttpServer::readyRead()
{
    QTcpSocket * socket = qobject_cast<QTcpSocket*>(sender());
    if(socket) {
        QByteArray request = socket->readAll();

        // 获取接口方法名
        int postIdx = request.indexOf("POST");
        int httpIdx = request.indexOf("HTTP/");
        if (postIdx >= 0 && httpIdx >= 0)
        {
            method = request.mid(postIdx + 5, httpIdx - postIdx - 6);
        }

        // 获取传递的参数数据
        int startIdx = request.indexOf('{');
        if (startIdx > 0)
        {
            content.append(request.mid(startIdx, request.size() - startIdx - 1));
        } else {
            content.append(request);
        }

        if (request.at(request.size() - 1) == '}')
        {
            QByteArray response = this->buildHeartBeatResponse().toUtf8();

            QString http = "HTTP/1.1 200 OK\r\n";
            http += "Server: qt server\r\n";
            http += "Content-Type: application/json;charset=utf-8\r\n";
            http += "Connection: keep-alive\r\n";
            http += QString("Content-Length: %1\r\n\r\n").arg(QString::number(response.size()));

            socket->write(http.toUtf8());
            socket->write(response);
            socket->flush();
            socket->waitForBytesWritten(http.size() + response.size());
            socket->close();
        }
    }
}

QString HttpServer::buildHeartBeatResponse()
{
    QJsonObject resp;
    resp.insert("code", 200);
    resp.insert("success", true);

    return QString(QJsonDocument(resp).toJson(QJsonDocument::Compact));
}

QString HttpServer::buildRemoteAddResponse()
{
    QJsonObject resp;
    resp.insert("code", 200);
    resp.insert("success", true);
    resp.insert("count", 1);

    return QString(QJsonDocument(resp).toJson(QJsonDocument::Compact));
}
QString HttpServer::buildRemoteDeleteResponse()
{
    QJsonObject resp;
    resp.insert("code", 200);
    resp.insert("success", true);
    resp.insert("count", 1);

    return QString(QJsonDocument(resp).toJson(QJsonDocument::Compact));
}