Russian Qt Forum
Ноябрь 22, 2024, 20:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]QNetWorkManager - прием объекта javascript  (Прочитано 6698 раз)
Larry
Гость
« : Январь 26, 2017, 10:47 »

Добрый день, форумчане!
Необходимо работать с одним ресурсом, который возвращает информацию ввиде объекта javascript.
Попытался сделать запрос:
Код:
QString dns = "http://hst-api.wialon.com/wialon/ajax.html";
QString token = "117b6de8b8560a1b2d078c92fca6bafaDE5A417A7E5168A59F6A1E342ED652867633B3C";
QString request = dns + "?svc=token/login&params={\"token\":\"" + token + "\"}";

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotReplyFinished(QNetworkReply*)));

manager->get(QNetworkRequest(QUrl(request)));

Код:
void CMainWindow::slotReplyFinished(QNetworkReply* reply)
{
    qDebug() << reply->errorString();
    qDebug() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
}

В ответ получаю Unknown error и по атрибуту код 200, т.е. все успешно.
Посмотрел через wireshark и вижу что все приходит, но как теперь получить объект javascript, т.к. вся инфа в нем?
« Последнее редактирование: Январь 27, 2017, 17:15 от Larry » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Январь 26, 2017, 17:07 »

попробуй явно задать ему ожидаемый Content-Type:
Код
C++ (Qt)
QNetworkRequest netRequest(QUrl(request));
netRequest.setHeader(QNetworkRequest::ContentTypeHeader, QStringLiteral("application/json"));
manager->get(netRequest);
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Larry
Гость
« Ответ #2 : Январь 26, 2017, 18:04 »

Спасибо, но к сожалению это не помогло...Возвращает тоже самое..
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Январь 26, 2017, 18:09 »

Так а в чём проблема-то? reply->readAll() вернёт тебе твой JSON в виде текста, которых потом нужно распарсить с помощью QJSonDocument
Записан
Larry
Гость
« Ответ #4 : Январь 27, 2017, 10:23 »

Проблема в том, что readAll ничего не возвращает - размер QByteArray = 0.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Январь 27, 2017, 13:13 »

Код
C++ (Qt)
   QString dns = "http://hst-api.wialon.com/wialon/ajax.html";
   QString token = "117b6de8b8560a1b2d078c92fca6bafaDE5A417A7E5168A59F6A1E342ED652867633B3C";
   QString request = dns + "?svc=token/login&params={\"token\":\"" + token + "\"}";
 
   QNetworkAccessManager *manager = new QNetworkAccessManager;
 
   QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(request)));
   QEventLoop loop;
 
   QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
   loop.exec();
 
   qDebug() << reply->readAll();

Печатает

Цитировать
"{\"error\":4}\n"

то есть ответ приходит, хоть и ошибочный.
Записан
Larry
Гость
« Ответ #6 : Январь 27, 2017, 15:23 »

Там уже не рабочий token, потому и ошибку выдает. Создал новый, но тогда программа ничего не выдает, а через время завершает работу, но данных нет.

вот новый token: 905b6be8b8560a1b2d078c92fca6bafaDE417407A7E5168A59F6A1E342ED652867679A3B

Попробуйте пожалуйста, может у Вас получится Улыбающийся
Спасибо.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Январь 27, 2017, 16:45 »

Код
C++ (Qt)
   QString dns = "http://hst-api.wialon.com/wialon/ajax.html";
   QString token = "905b6be8b8560a1b2d078c92fca6bafaDE417407A7E5168A59F6A1E342ED652867679A3B";
   QString request = dns + "?svc=token%2Flogin&params={\"token\":\"" + token + "\"}";
 
   QNetworkAccessManager *manager = new QNetworkAccessManager;
   QNetworkReply *reply = manager->get(QNetworkRequest(request));
 
   QEventLoop loop;
 
   QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
   loop.exec();
 
   qDebug() << reply->readAll().length();
 

Вывод:

Цитировать
133362

Всё что сделал, это заэскейпил token%2Flogin
Записан
Larry
Гость
« Ответ #8 : Январь 27, 2017, 17:14 »

Спасибо большое. Так заработало.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.272 секунд. Запросов: 23.