Михаиллл
Михаиллл18 февраля 2020 г. 10:18

Как в QtWebApp принять POST запрос

QtWebApp, POSt

Добрый день.
Разбираюсь в библиотеке QtWebApp.
Так обрабатываю get запрос. Подскажите пожалуйста, как принять и обработать POST запрос?
И может быть Вы знаете, почему qDebug() ничего не выводит?

void RequestHandler::service(HttpRequest& request, HttpResponse& response)
{
    QByteArray path=request.getPath();   
    //response.setHeader("Content-Type", "text/html; charset=ISO-8859-1");
    response.setHeader("Content-Type", "application/json; charset=ISO-8859-1");

    //обработчик запросов
    if (path.startsWith("/111"))
    {
        response.write("1 - 1 - 1",true);
        qDebug()<<11111;
    }
    else if (path.startsWith("/222"))
    {
        response.write("2 - 2 - 2",true);
    }
    else if (path.endsWith("/333"))
    {
        response.write("3 - 3 - 3",true);
    }
    else
    {
        response.write("0 - 0 - 0",true);
    }

    qDebug("Conroller: finished request");

    // Clear the log buffer
    if (logger)
    {
       logger->clear();
    }
}
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

12
Ruslan Polupan
  • 18 февраля 2020 г. 10:35

Я читаю параметры запроса. если они не пустые сохраняю в сессию. затем ими пользуюсь

вот мой requestmapper.cpp

#include "requestmapper.h"
#include "global.h"


RequestMapper::RequestMapper(QObject *parent) :
    HttpRequestHandler(parent)
{
    userID = 0;
    modelUsers = new QSqlQueryModel(this);
    modelUsers->setQuery("SELECT c.user_id, c.username, c.userpass FROM clientusers c where c.isactive = 'true'");
}


void RequestMapper::service(HttpRequest &request, HttpResponse &response)
{
    HttpSession session=sessionStore->getSession(request,response,true);

    QByteArray username=request.getParameter("username");
    QByteArray password=request.getParameter("password");
    QByteArray objectID=request.getParameter("objectID");
    QByteArray shiftID =request.getParameter("shiftID");

    qDebug("username=%s",username.constData());
    qDebug("password=%s",password.constData());
    qDebug("objectID=%s",objectID.constData());
    qDebug("shiftID=%s",shiftID.constData());

    if(username.length() !=0){
        userID=getUserID(QString(username), QString(password));
    }

    QByteArray path=request.getPath();
    qDebug("RequestMapper: path=%s",path.data());

    if(path == "/"){
        response.redirect("/login.html");
        return;
    } else if (path=="/login.html") {
        staticFileController->service(request,response);
    } else if (path == "/objects" && userID > 0){
        session.set("userID",userID);
        objectsList.service(request,response);
    } else if(path == "/shifts" && objectID.length()>0) {
        session.set("objectID",objectID);
        shiftList.service(request,response);
    } else if (path == "/report" && shiftID.length()>0){
        session.set("shiftID",shiftID);
        shiftReport.service(request,response);
    }
    else {
        response.setStatus(404,"Not found");
        response.write("The URL is wrong, no such document.",true);
    }

    qDebug("RequestMapper: finished request");
}

uint RequestMapper::getUserID(QString login, QString pass)
{
    uint userID = 0;
    const int rowCount = modelUsers->rowCount();
    for(int row=0; row<rowCount; ++row){
        if(modelUsers->data(modelUsers->index(row,1)).toString() == login){
            if(modelUsers->data(modelUsers->index(row,2)).toString() == pass){
                userID = modelUsers->data(modelUsers->index(row,0)).toUInt();
                break;
            }
        }
    }
    return userID;

}

Если поможет ссылка на GitHub https://github.com/rust3128/MposOnlineReports

    Михаиллл
    • 18 февраля 2020 г. 10:46

    А у Вас qDebug() нормально выводит?

      Ruslan Polupan
      • 18 февраля 2020 г. 10:52

      да

      18.02.2020 16:57:57.940 0 DEBUG     HttpSession: (constructor) copy session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=2
      18.02.2020 16:57:57.940 0 DEBUG     HttpSession: (constructor) copy session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=3
      18.02.2020 16:57:57.940 0 DEBUG     HttpSession: (destructor) session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=2
      18.02.2020 16:57:57.940 0 DEBUG     username=
      18.02.2020 16:57:57.940 0 DEBUG     password=
      18.02.2020 16:57:57.940 0 DEBUG     objectID=
      18.02.2020 16:57:57.940 0 DEBUG     shiftID=2020
      18.02.2020 16:57:57.940 0 DEBUG     RequestMapper: path=/report
      18.02.2020 16:57:57.940 0 DEBUG     HttpSession: (constructor) copy session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=3
      18.02.2020 16:57:57.940 0 DEBUG     HttpSession: (constructor) copy session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=4
      18.02.2020 16:57:57.940 0 DEBUG     HttpSession: (destructor) session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=3
      18.02.2020 16:57:57.940 0 DEBUG     object ID report 1 shiftID report 2020
      18.02.2020 16:58:02.920 0 DEBUG     HttpConnectionHandler (0x114f200): disconnected
      18.02.2020 16:58:10.771 0 DEBUG     language=ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
      18.02.2020 16:58:10.771 0 DEBUG     TemplateCache: trying cached shiftreport
      18.02.2020 16:58:10.771 0 DEBUG     TemplateCache: trying file /home/rust/develop/MposOnlineReports/docroot/shiftreport.html
      18.02.2020 16:58:10.802 0 DEBUG     HttpSession: (destructor) session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=2
      18.02.2020 16:58:10.802 0 DEBUG     RequestMapper: finished request
      18.02.2020 16:58:10.802 0 DEBUG     HttpSession: (destructor) session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=1
      18.02.2020 16:58:10.802 0 DEBUG     HttpConnectionHandler (0x115e120): finished request
      18.02.2020 16:58:17.914 0 DEBUG     HttpSession: (constructor) copy session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=2
      18.02.2020 16:58:17.915 0 DEBUG     HttpSession: (destructor) session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=1
      
      
        Михаиллл
        • 18 февраля 2020 г. 11:01

        Странно, у меня дебаг не работает. Может быть Вы знаете причину?
        Отправляю такой запрос:

            QByteArray data = ("\n{\n\"UserId\" :\"");
            data.append("dgvwd");
            data.append("\",\n\"Message\" : \"");
            data.append("edgvedbed");
            data.append("\",\n\"Slag\" :\"");
            data.append("slag");
            data.append("\",\n\"Phone\" :\"");
            data.append("dbvgwdb");
            data.append("\"\n}\n\n");
            request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
            request.setHeader(QNetworkRequest::ContentLengthHeader,QByteArray::number(data.size()));
            myApiQuery.post(request, data);
        

        Принимаю его так:

        void RequestHandler::service(HttpRequest& request, HttpResponse& response)
        {
            QTextStream out(stdout);
        
        
            QByteArray username=request.getParameter("UserId");
            QByteArray password=request.getParameter("Message");
            QByteArray objectID=request.getParameter("Slag");
            QByteArray shiftID =request.getParameter("Phone");
        
            qDebug("UserId=%s",username.constData());
            qDebug("Message=%s",password.constData());
            qDebug("Slag=%s",objectID.constData());
            qDebug("Phone=%s",shiftID.constData());
            out << "UserId : "<<username.constData()<<"\n";
            out << "Message : "<<password.constData()<<"\n";
            out << "Slag : "<<objectID.constData()<<"\n";
            out << "Phone : "<<shiftID.constData()<<"\n";
        

        На выводе поля получаются пустые. Как вы думаете, почему это не работает?

          Ruslan Polupan
          • 18 февраля 2020 г. 14:14

          [logging]
          minLevel=0 такое значение?

            Михаиллл
            • 18 февраля 2020 г. 15:16

            Нет, стоит minLevel=1
            А что это значит?
            Поменял на 0, но ничего не изменилось.
            Файл настроек выглядит так

            [listener]
            ; host=192.168.0.100
            port=8080
            minThreads=4
            maxThreads=100
            cleanupInterval=60000
            readTimeout=60000
            maxRequestSize=16000
            maxMultiPartSize=10000000
            
            [logging]
            fileName=../logs/HttpSerwerQtWebApp.log
            minLevel=0
            bufferSize=100
            maxSize=1000000
            maxBackups=2
            timestampFormat=dd.MM.yyyy hh:mm:ss.zzz
            msgFormat={timestamp} {typeNr} {type} {thread} {msg}
            ; QT5 supports: msgFormat={timestamp} {typeNr} {type} {thread} {msg}\n  in {file} line {line} function {function}
            
            [docroot]
            path=docroot
            encoding=UTF-8
            maxAge=60000
            cacheTime=60000
            cacheSize=1000000
            maxCachedFileSize=65536
            
              Михаиллл
              • 19 февраля 2020 г. 6:07
              • Ответ был помечен как решение.

              Вот так получается джисон из пост запроса , но дебаг к сожалению не заработал

              request.getBody()
              
                Ruslan Polupan
                • 19 февраля 2020 г. 6:23

                файл logger.cpp
                У вас так?

                        // If the type of the message is high enough, print the whole buffer
                        // With one Exception: INFO messages are treated like DEBUG messages here
                        QtMsgType level=(type==QtInfoMsg?QtDebugMsg:type);
                        if (level>=minLevel)
                
                  Михаиллл
                  • 19 февраля 2020 г. 6:27

                  У меня так же

                          // If the type of the message is high enough, print the whole buffer
                          // With one Exception: INFO messages are treated like DEBUG messages here
                          QtMsgType level=(type==QtInfoMsg?QtDebugMsg:type);
                          if (level>=minLevel)
                  

                  В лог дебаг записывает, но привычной записи в консоль qt не происходит

                    Ruslan Polupan
                    • 19 февраля 2020 г. 6:46

                    а туда и нету вывода

                      Михаиллл
                      • 19 февраля 2020 г. 6:54

                      понятно, думал что дебаг будет стандартно работать.
                      спасибо за помощь!

                        D
                        • 7 сентября 2020 г. 11:40

                        в main.cpp закомментил //logger->installMsgHandler();

                          Комментарии

                          Только авторизованные пользователи могут публиковать комментарии.
                          Пожалуйста, авторизуйтесь или зарегистрируйтесь
                          e
                          • ehot
                          • 1 апреля 2024 г. 2:29

                          C++ - Тест 003. Условия и циклы

                          • Результат:78баллов,
                          • Очки рейтинга2
                          B

                          C++ - Тест 002. Константы

                          • Результат:16баллов,
                          • Очки рейтинга-10
                          B

                          C++ - Тест 001. Первая программа и типы данных

                          • Результат:46баллов,
                          • Очки рейтинга-6
                          Последние комментарии
                          k
                          kmssr9 февраля 2024 г. 7:43
                          Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                          АК
                          Анатолий Кононенко5 февраля 2024 г. 14:50
                          Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                          EVA
                          EVA25 декабря 2023 г. 23:30
                          Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                          J
                          JonnyJo25 декабря 2023 г. 21:38
                          Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                          G
                          Gvozdik19 декабря 2023 г. 10:01
                          Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                          Сейчас обсуждают на форуме
                          a
                          a_vlasov14 апреля 2024 г. 18:41
                          Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                          Павел Дорофеев
                          Павел Дорофеев14 апреля 2024 г. 14:35
                          QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                          f
                          fastrex4 апреля 2024 г. 16:47
                          Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
                          P
                          Pisych27 февраля 2023 г. 17:04
                          Как получить в массив значения из связанной модели? Спасибо, разобрался:))
                          AC
                          Alexandru Codreanu20 января 2024 г. 0:57
                          QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

                          Следите за нами в социальных сетях