Михаиллл
Михаиллл31 травня 2019 р. 11:01

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

API

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

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

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

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

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

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

11
Evgenii Legotckoi
  • 04 червня 2019 р. 06:08

Добрый день.

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

    Михаиллл
    • 04 червня 2019 р. 08:51

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

      Evgenii Legotckoi
      • 04 червня 2019 р. 08:56
      • (відредаговано)

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

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

      QNetworkRequest request("http://target_site.com"); 
      request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
      
        Михаиллл
        • 04 червня 2019 р. 09:49

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

          Evgenii Legotckoi
          • 04 червня 2019 р. 09:51
          • (відредаговано)

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

            Михаиллл
            • 04 червня 2019 р. 10:13
            • (відредаговано)

            НЕ могли бы вы проверить, заработает ли у вас этот запрос и прийдет ли 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
              • 04 червня 2019 р. 10:46
              • (відредаговано)
              • Відповідь була позначена як рішення.

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

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

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

              #ifndef MAINWINDOW_H
              #define MAINWINDOW_H
              
              #include <QMainWindow>
              #include "QDebug"
              #include "QtNetwork/QNetworkAccessManager"
              #include "QtNetwork/QNetworkRequest"
              #include "QtNetwork/QNetworkReply"
              #include <QUrl>
              #include <QJsonArray>
              #include <QJsonDocument>
              #include <QJsonObject>
              #include <QJsonValue>
              #include <QTextCodec>  // для преобразования кодировки
              //#include "e_os.h"
              
              namespace Ui {
              class MainWindow;
              }
              
              class MainWindow : public QMainWindow
              {
                  Q_OBJECT
              
              public:
                  explicit MainWindow(QWidget *parent = nullptr);
                  ~MainWindow();
              
              private slots:
                  void on_testButton_clicked();
                  void onReply(QNetworkReply* reply);
              
              private:
                  Ui::MainWindow *ui;
                  QNetworkAccessManager m_apiQuery;
              };
              
              #endif // MAINWINDOW_H
              
              

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

              #include "mainwindow.h"
              #include "ui_mainwindow.h"
              
              MainWindow::MainWindow(QWidget *parent) :
                  QMainWindow(parent),
                  ui(new Ui::MainWindow)
              {
                  ui->setupUi(this);
                  connect(&m_apiQuery, &QNetworkAccessManager::finished, this, &MainWindow::onReply);
              }
              
              MainWindow::~MainWindow()
              {
                  delete ui;
              }
              
              void MainWindow::on_testButton_clicked()
              {
                  QNetworkRequest request;
                  request.setUrl(QUrl("https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=MSFT&outputsize=compact&apikey=63YUZ8NP5SW1D302"));
                  m_apiQuery.get(request);
              }
              
              
              void MainWindow::onReply(QNetworkReply* reply){
                  QByteArray replyArray;
                  while (!reply->atEnd()) {
                      replyArray.append(reply->readLine());
                  }
                  QJsonDocument doc = QJsonDocument::fromJson(replyArray);
                  qDebug() << doc;
                  reply->deleteLater();
              }
              
              

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

                Михаиллл
                • 04 червня 2019 р. 11:51
                • (відредаговано)

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

                    QString FileName = "C:\\Users\\New Owner\\Downloads\\jdoc.json";
                    QFileInfo FileInfoName(FileName);
                    QDir::setCurrent(FileInfoName.path());
                    QFile FileForRecord(FileName);
                    if (!FileForRecord.open(QIODevice::WriteOnly))
                    {
                        //return;
                    }
                    FileForRecord.write(QJsonDocument(doc).toJson());
                    FileForRecord.close();
                
                  Evgenii Legotckoi
                  • 05 червня 2019 р. 03:17

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

                    Михаиллл
                    • 05 червня 2019 р. 04:08

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

                      Evgenii Legotckoi
                      • 05 червня 2019 р. 04:10

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

                        Коментарі

                        Only authorized users can post comments.
                        Please, Log in or Sign up
                        sf

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

                        • Результат:90бали,
                        • Рейтинг балів8
                        МВ

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

                        • Результат:68бали,
                        • Рейтинг балів-1
                        ЛС

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

                        • Результат:53бали,
                        • Рейтинг балів-4
                        Останні коментарі
                        A
                        ALO1ZE19 жовтня 2024 р. 08:19
                        Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                        ИМ
                        Игорь Максимов05 жовтня 2024 р. 07:51
                        Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                        d
                        dblas505 липня 2024 р. 11:02
                        QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                        k
                        kmssr08 лютого 2024 р. 18:43
                        Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                        АК
                        Анатолий Кононенко05 лютого 2024 р. 01:50
                        Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                        Тепер обговоріть на форумі
                        J
                        JacobFib17 жовтня 2024 р. 03:27
                        добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                        ИМ
                        Игорь Максимов03 жовтня 2024 р. 04:05
                        Реализация навигации по разделам Спасибо Евгений!
                        JW
                        Jhon Wick01 жовтня 2024 р. 15:52
                        Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                        КГ
                        Кирилл Гусарев27 вересня 2024 р. 09:09
                        Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                        F
                        Fynjy22 липня 2024 р. 04:15
                        при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                        Слідкуйте за нами в соціальних мережах