Михаиллл
May 31, 2019, 9:01 p.m.

В Qt трудности с API

API

Добрый день.
Пытаюсь подключиться по этой документации.
Если делаю так

  1. request.setUrl(QUrl("https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=MSFT&outputsize=compact&apikey=63YUZ8NP5SW1D300"));

то получаю json. А если делаю так:

  1. request.setUrl(QUrl("https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=MSFT&outputsize=full&apikey=63YUZ8NP5SW1D300"));

то ничего не получаю.
Разница в outputsize=full и outputsize=compact
Это у меня в коде касяк , или я что то не понимаю , или это на сервере касяк?

2

Do you like it? Share on social networks!

11
Evgenii Legotckoi
  • June 4, 2019, 4:08 p.m.

Добрый день.

Через браузер API работает. Может там перенаправление есть, тогда нужно разрешить перенаправления для получения данных. По умолчанию QNetworkAccessManager игнорит перенаправления.

    Михаиллл
    • June 4, 2019, 6:51 p.m.

    Тут почитал, нашел только QNetworkAccessManager::NetworkAccessibility и QNetworkAccessManager::Operation, но это явно не то. Скажите пожалуста как разрешить перенаправления?

      Evgenii Legotckoi
      • June 4, 2019, 6:56 p.m.
      • (edited)

      Когда формируете QNetworkRequest, то ему можно задать некоторые атрибуты, а также заголовочную информацию.

      Для редиректов это может выглядеть так.

      1. QNetworkRequest request("http://target_site.com");
      2. request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
        Михаиллл
        • June 4, 2019, 7:49 p.m.

        Не помогло. Говорят что это на MacOS работает... Можеь быть дело в размере json

          Evgenii Legotckoi
          • June 4, 2019, 7:51 p.m.
          • (edited)

          Не знаю, что в размере json, но установка атрибутов через setAttribute работает везде. Тем более для редиректа. В этом я уверен.

            Михаиллл
            • June 4, 2019, 8:13 p.m.
            • (edited)

            НЕ могли бы вы проверить, заработает ли у вас этот запрос и прийдет ли json

            alphaVantageApiStocks.rar alphaVantageApiStocks.rar

            build-alphaVantageApiStocks-Desktop_Qt_5_12_3_MinGW_32_bit-Debug.rar build-alphaVantageApiStocks-Desktop_Qt_5_12_3_MinGW_32_bit-Debug.rar

              Evgenii Legotckoi
              • June 4, 2019, 8:46 p.m.
              • (edited)
              • The answer was marked as a solution.

              Да, это проблема с размером JSON. Это проблема Windows, конкретно под Windows метод readAll не работает с очень большими массивами данных. Нужно использовать readLine.

              Я поправил ваш код следующим образом.

              Заголовочный файл

              1. #ifndef MAINWINDOW_H
              2. #define MAINWINDOW_H
              3.  
              4. #include <QMainWindow>
              5. #include "QDebug"
              6. #include "QtNetwork/QNetworkAccessManager"
              7. #include "QtNetwork/QNetworkRequest"
              8. #include "QtNetwork/QNetworkReply"
              9. #include <QUrl>
              10. #include <QJsonArray>
              11. #include <QJsonDocument>
              12. #include <QJsonObject>
              13. #include <QJsonValue>
              14. #include <QTextCodec> // для преобразования кодировки
              15. //#include "e_os.h"
              16.  
              17. namespace Ui {
              18. class MainWindow;
              19. }
              20.  
              21. class MainWindow : public QMainWindow
              22. {
              23. Q_OBJECT
              24.  
              25. public:
              26. explicit MainWindow(QWidget *parent = nullptr);
              27. ~MainWindow();
              28.  
              29. private slots:
              30. void on_testButton_clicked();
              31. void onReply(QNetworkReply* reply);
              32.  
              33. private:
              34. Ui::MainWindow *ui;
              35. QNetworkAccessManager m_apiQuery;
              36. };
              37.  
              38. #endif // MAINWINDOW_H
              39.  

              Файл реализации

              1. #include "mainwindow.h"
              2. #include "ui_mainwindow.h"
              3.  
              4. MainWindow::MainWindow(QWidget *parent) :
              5. QMainWindow(parent),
              6. ui(new Ui::MainWindow)
              7. {
              8. ui->setupUi(this);
              9. connect(&m_apiQuery, &QNetworkAccessManager::finished, this, &MainWindow::onReply);
              10. }
              11.  
              12. MainWindow::~MainWindow()
              13. {
              14. delete ui;
              15. }
              16.  
              17. void MainWindow::on_testButton_clicked()
              18. {
              19. QNetworkRequest request;
              20. request.setUrl(QUrl("https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=MSFT&outputsize=compact&apikey=63YUZ8NP5SW1D302"));
              21. m_apiQuery.get(request);
              22. }
              23.  
              24.  
              25. void MainWindow::onReply(QNetworkReply* reply){
              26. QByteArray replyArray;
              27. while (!reply->atEnd()) {
              28. replyArray.append(reply->readLine());
              29. }
              30. QJsonDocument doc = QJsonDocument::fromJson(replyArray);
              31. qDebug() << doc;
              32. reply->deleteLater();
              33. }
              34.  

              Это проблема конкретно метода readAll Поэтому вы можете считать построчно всё в QByteArray, а потом уже конвертировать в QJsonDocument из него. При этом, если количество данных будет очень большое, то всё равно будут проблемы с выводом в qDebug. Так что используйте запрос на outputsize=compact . С full у меня не получилось вывести данные в qDebug.

                Михаиллл
                • June 4, 2019, 9:51 p.m.
                • (edited)

                Спасибо, записал так в файл и все заработало.
                А админы на форуме Qt не догадались в чем дело.

                1. QString FileName = "C:\\Users\\New Owner\\Downloads\\jdoc.json";
                2. QFileInfo FileInfoName(FileName);
                3. QDir::setCurrent(FileInfoName.path());
                4. QFile FileForRecord(FileName);
                5. if (!FileForRecord.open(QIODevice::WriteOnly))
                6. {
                7. //return;
                8. }
                9. FileForRecord.write(QJsonDocument(doc).toJson());
                10. FileForRecord.close();
                  Evgenii Legotckoi
                  • June 5, 2019, 1:17 p.m.

                  Я уже сталкивался с этой проблемой. Эта проблема общая для всех классов, наследованных от QIODevice . Тоже самое проявляется с QFile и т.д. Причём проявляется именно под Windows.

                    Михаиллл
                    • June 5, 2019, 2:08 p.m.

                    А почему так? Ведь мощности компа хватает для хранения этой информации в оперативной памяти, или тут упирается в кэш процесора?

                      Evgenii Legotckoi
                      • June 5, 2019, 2:10 p.m.

                      Понятия не имею. Мне это не было интересно, может быть баг. Но то, что запихать многогигабайтные файлы в память просто так не получится, то это факт. Может быть под Windows есть ограничения. Кто знает? ...

                        Comments

                        Only authorized users can post comments.
                        Please, Log in or Sign up
                        • Last comments
                        • Evgenii Legotckoi
                          April 16, 2025, 5:08 p.m.
                          Благодарю за отзыв. И вам желаю всяческих успехов!
                        • IscanderChe
                          April 12, 2025, 5:12 p.m.
                          Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
                        • 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, установлены. Кроме одного... Когда пытаюсь скомпилиров…