Михаиллл
Feb. 18, 2020, 9:18 p.m.

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

QtWebApp, POSt

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

  1. void RequestHandler::service(HttpRequest& request, HttpResponse& response)
  2. {
  3. QByteArray path=request.getPath();
  4. //response.setHeader("Content-Type", "text/html; charset=ISO-8859-1");
  5. response.setHeader("Content-Type", "application/json; charset=ISO-8859-1");
  6.  
  7. //обработчик запросов
  8. if (path.startsWith("/111"))
  9. {
  10. response.write("1 - 1 - 1",true);
  11. qDebug()<<11111;
  12. }
  13. else if (path.startsWith("/222"))
  14. {
  15. response.write("2 - 2 - 2",true);
  16. }
  17. else if (path.endsWith("/333"))
  18. {
  19. response.write("3 - 3 - 3",true);
  20. }
  21. else
  22. {
  23. response.write("0 - 0 - 0",true);
  24. }
  25.  
  26. qDebug("Conroller: finished request");
  27.  
  28. // Clear the log buffer
  29. if (logger)
  30. {
  31. logger->clear();
  32. }
  33. }
4

Do you like it? Share on social networks!

12
Ruslan Polupan
  • Feb. 18, 2020, 9:35 p.m.

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

вот мой requestmapper.cpp

  1. #include "requestmapper.h"
  2. #include "global.h"
  3.  
  4.  
  5. RequestMapper::RequestMapper(QObject *parent) :
  6. HttpRequestHandler(parent)
  7. {
  8. userID = 0;
  9. modelUsers = new QSqlQueryModel(this);
  10. modelUsers->setQuery("SELECT c.user_id, c.username, c.userpass FROM clientusers c where c.isactive = 'true'");
  11. }
  12.  
  13.  
  14. void RequestMapper::service(HttpRequest &request, HttpResponse &response)
  15. {
  16. HttpSession session=sessionStore->getSession(request,response,true);
  17.  
  18. QByteArray username=request.getParameter("username");
  19. QByteArray password=request.getParameter("password");
  20. QByteArray objectID=request.getParameter("objectID");
  21. QByteArray shiftID =request.getParameter("shiftID");
  22.  
  23. qDebug("username=%s",username.constData());
  24. qDebug("password=%s",password.constData());
  25. qDebug("objectID=%s",objectID.constData());
  26. qDebug("shiftID=%s",shiftID.constData());
  27.  
  28. if(username.length() !=0){
  29. userID=getUserID(QString(username), QString(password));
  30. }
  31.  
  32. QByteArray path=request.getPath();
  33. qDebug("RequestMapper: path=%s",path.data());
  34.  
  35. if(path == "/"){
  36. response.redirect("/login.html");
  37. return;
  38. } else if (path=="/login.html") {
  39. staticFileController->service(request,response);
  40. } else if (path == "/objects" && userID > 0){
  41. session.set("userID",userID);
  42. objectsList.service(request,response);
  43. } else if(path == "/shifts" && objectID.length()>0) {
  44. session.set("objectID",objectID);
  45. shiftList.service(request,response);
  46. } else if (path == "/report" && shiftID.length()>0){
  47. session.set("shiftID",shiftID);
  48. shiftReport.service(request,response);
  49. }
  50. else {
  51. response.setStatus(404,"Not found");
  52. response.write("The URL is wrong, no such document.",true);
  53. }
  54.  
  55. qDebug("RequestMapper: finished request");
  56. }
  57.  
  58. uint RequestMapper::getUserID(QString login, QString pass)
  59. {
  60. uint userID = 0;
  61. const int rowCount = modelUsers->rowCount();
  62. for(int row=0; row<rowCount; ++row){
  63. if(modelUsers->data(modelUsers->index(row,1)).toString() == login){
  64. if(modelUsers->data(modelUsers->index(row,2)).toString() == pass){
  65. userID = modelUsers->data(modelUsers->index(row,0)).toUInt();
  66. break;
  67. }
  68. }
  69. }
  70. return userID;
  71.  
  72. }
  73.  

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

    Михаиллл
    • Feb. 18, 2020, 9:46 p.m.

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

      Ruslan Polupan
      • Feb. 18, 2020, 9:52 p.m.

      да

      1. 18.02.2020 16:57:57.940 0 DEBUG HttpSession: (constructor) copy session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=2
      2. 18.02.2020 16:57:57.940 0 DEBUG HttpSession: (constructor) copy session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=3
      3. 18.02.2020 16:57:57.940 0 DEBUG HttpSession: (destructor) session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=2
      4. 18.02.2020 16:57:57.940 0 DEBUG username=
      5. 18.02.2020 16:57:57.940 0 DEBUG password=
      6. 18.02.2020 16:57:57.940 0 DEBUG objectID=
      7. 18.02.2020 16:57:57.940 0 DEBUG shiftID=2020
      8. 18.02.2020 16:57:57.940 0 DEBUG RequestMapper: path=/report
      9. 18.02.2020 16:57:57.940 0 DEBUG HttpSession: (constructor) copy session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=3
      10. 18.02.2020 16:57:57.940 0 DEBUG HttpSession: (constructor) copy session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=4
      11. 18.02.2020 16:57:57.940 0 DEBUG HttpSession: (destructor) session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=3
      12. 18.02.2020 16:57:57.940 0 DEBUG object ID report 1 shiftID report 2020
      13. 18.02.2020 16:58:02.920 0 DEBUG HttpConnectionHandler (0x114f200): disconnected
      14. 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
      15. 18.02.2020 16:58:10.771 0 DEBUG TemplateCache: trying cached shiftreport
      16. 18.02.2020 16:58:10.771 0 DEBUG TemplateCache: trying file /home/rust/develop/MposOnlineReports/docroot/shiftreport.html
      17. 18.02.2020 16:58:10.802 0 DEBUG HttpSession: (destructor) session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=2
      18. 18.02.2020 16:58:10.802 0 DEBUG RequestMapper: finished request
      19. 18.02.2020 16:58:10.802 0 DEBUG HttpSession: (destructor) session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=1
      20. 18.02.2020 16:58:10.802 0 DEBUG HttpConnectionHandler (0x115e120): finished request
      21. 18.02.2020 16:58:17.914 0 DEBUG HttpSession: (constructor) copy session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=2
      22. 18.02.2020 16:58:17.915 0 DEBUG HttpSession: (destructor) session {3540ed62-cd8b-4e00-8ca6-6ac5633dd22c} refCount=1
      23.  
        Михаиллл
        • Feb. 18, 2020, 10:01 p.m.

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

        1. QByteArray data = ("\n{\n\"UserId\" :\"");
        2. data.append("dgvwd");
        3. data.append("\",\n\"Message\" : \"");
        4. data.append("edgvedbed");
        5. data.append("\",\n\"Slag\" :\"");
        6. data.append("slag");
        7. data.append("\",\n\"Phone\" :\"");
        8. data.append("dbvgwdb");
        9. data.append("\"\n}\n\n");
        10. request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
        11. request.setHeader(QNetworkRequest::ContentLengthHeader,QByteArray::number(data.size()));
        12. myApiQuery.post(request, data);

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

        1. void RequestHandler::service(HttpRequest& request, HttpResponse& response)
        2. {
        3. QTextStream out(stdout);
        4.  
        5.  
        6. QByteArray username=request.getParameter("UserId");
        7. QByteArray password=request.getParameter("Message");
        8. QByteArray objectID=request.getParameter("Slag");
        9. QByteArray shiftID =request.getParameter("Phone");
        10.  
        11. qDebug("UserId=%s",username.constData());
        12. qDebug("Message=%s",password.constData());
        13. qDebug("Slag=%s",objectID.constData());
        14. qDebug("Phone=%s",shiftID.constData());
        15. out << "UserId : "<<username.constData()<<"\n";
        16. out << "Message : "<<password.constData()<<"\n";
        17. out << "Slag : "<<objectID.constData()<<"\n";
        18. out << "Phone : "<<shiftID.constData()<<"\n";

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

          Ruslan Polupan
          • Feb. 19, 2020, 1:14 a.m.

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

            Михаиллл
            • Feb. 19, 2020, 2:16 a.m.

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

            1. [listener]
            2. ; host=192.168.0.100
            3. port=8080
            4. minThreads=4
            5. maxThreads=100
            6. cleanupInterval=60000
            7. readTimeout=60000
            8. maxRequestSize=16000
            9. maxMultiPartSize=10000000
            10.  
            11. [logging]
            12. fileName=../logs/HttpSerwerQtWebApp.log
            13. minLevel=0
            14. bufferSize=100
            15. maxSize=1000000
            16. maxBackups=2
            17. timestampFormat=dd.MM.yyyy hh:mm:ss.zzz
            18. msgFormat={timestamp} {typeNr} {type} {thread} {msg}
            19. ; QT5 supports: msgFormat={timestamp} {typeNr} {type} {thread} {msg}\n in {file} line {line} function {function}
            20.  
            21. [docroot]
            22. path=docroot
            23. encoding=UTF-8
            24. maxAge=60000
            25. cacheTime=60000
            26. cacheSize=1000000
            27. maxCachedFileSize=65536
              Михаиллл
              • Feb. 19, 2020, 5:07 p.m.
              • The answer was marked as a solution.

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

              1. request.getBody()
                Ruslan Polupan
                • Feb. 19, 2020, 5:23 p.m.

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

                1. // If the type of the message is high enough, print the whole buffer
                2. // With one Exception: INFO messages are treated like DEBUG messages here
                3. QtMsgType level=(type==QtInfoMsg?QtDebugMsg:type);
                4. if (level>=minLevel)
                  Михаиллл
                  • Feb. 19, 2020, 5:27 p.m.

                  У меня так же

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

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

                    Ruslan Polupan
                    • Feb. 19, 2020, 5:46 p.m.

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

                      Михаиллл
                      • Feb. 19, 2020, 5:54 p.m.

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

                        D
                        • Sept. 7, 2020, 9:40 p.m.

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

                          Comments

                          Only authorized users can post comments.
                          Please, Log in or Sign up
                          • Last comments
                          • AK
                            April 1, 2025, 11:41 a.m.
                            Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                          • Evgenii Legotckoi
                            March 9, 2025, 9:02 p.m.
                            К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                          • VP
                            March 9, 2025, 4:14 p.m.
                            Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                          • ИМ
                            Nov. 22, 2024, 9:51 p.m.
                            Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                          • Evgenii Legotckoi
                            Oct. 31, 2024, 11:37 p.m.
                            Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup