Михаиллл
МихаилллАқп. 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();

                          Пікірлер

                          Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                          Кіріңіз немесе Тіркеліңіз
                          OI
                          • Ora Iro
                          • Жел. 24, 2024, 6:38 Т.Ж.

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

                          • Нәтиже:40ұпай,
                          • Бағалау ұпайлары-8
                          AD

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Нәтиже:50ұпай,
                          • Бағалау ұпайлары-4
                          m
                          • molni99
                          • Қаз. 26, 2024, 1:37 Т.Ж.

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Нәтиже:80ұпай,
                          • Бағалау ұпайлары4
                          Соңғы пікірлер
                          ИМ
                          Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
                          Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                          Evgenii Legotckoi
                          Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
                          Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                          A
                          ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
                          Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                          ИМ
                          Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
                          Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                          d
                          dblas5Шілде 5, 2024, 11:02 Т.Ж.
                          QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                          Енді форумда талқылаңыз
                          Evgenii Legotckoi
                          Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                          t
                          tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
                          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                          NSProject
                          NSProjectМаусым 4, 2022, 3:49 Т.Ж.
                          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                          9
                          9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
                          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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