Михаиллл
МихаилллАқп. 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, 2:14 Т.Қ.

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

            Михаиллл
            • Ақп. 18, 2020, 3: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();

                          Пікірлер

                          Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                          Кіріңіз немесе Тіркеліңіз
                          Г

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

                          • Нәтиже:66ұпай,
                          • Бағалау ұпайлары-1
                          t

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

                          • Нәтиже:33ұпай,
                          • Бағалау ұпайлары-10
                          t

                          Qt - Тест 001. Сигналы и слоты

                          • Нәтиже:52ұпай,
                          • Бағалау ұпайлары-4
                          Соңғы пікірлер
                          G
                          GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
                          Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
                          d
                          dblas5Шілде 5, 2024, 11:02 Т.Ж.
                          QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                          k
                          kmssrАқп. 8, 2024, 6:43 Т.Қ.
                          Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                          АК
                          Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
                          Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                          Енді форумда талқылаңыз
                          Evgenii Legotckoi
                          Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                          F
                          FynjyШілде 22, 2024, 4:15 Т.Ж.
                          при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
                          BlinCT
                          BlinCTМаусым 25, 2024, 1 Т.Ж.
                          Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                          BlinCT
                          BlinCTМамыр 5, 2024, 5:46 Т.Ж.
                          Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                          Evgenii Legotckoi
                          Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
                          Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

                          Бізді әлеуметтік желілерде бақылаңыз