Russian Qt Forum

Qt => Работа с сетью => Тема начата: Larry от Январь 26, 2017, 10:47



Название: [РЕШЕНО]QNetWorkManager - прием объекта javascript
Отправлено: 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, т.к. вся инфа в нем?


Название: Re: QNetWorkManager - прием объекта javascript
Отправлено: kambala от Январь 26, 2017, 17:07
попробуй явно задать ему ожидаемый Content-Type:
Код
C++ (Qt)
QNetworkRequest netRequest(QUrl(request));
netRequest.setHeader(QNetworkRequest::ContentTypeHeader, QStringLiteral("application/json"));
manager->get(netRequest);


Название: Re: QNetWorkManager - прием объекта javascript
Отправлено: Larry от Январь 26, 2017, 18:04
Спасибо, но к сожалению это не помогло...Возвращает тоже самое..


Название: Re: QNetWorkManager - прием объекта javascript
Отправлено: Alex Custov от Январь 26, 2017, 18:09
Так а в чём проблема-то? reply->readAll() вернёт тебе твой JSON в виде текста, которых потом нужно распарсить с помощью QJSonDocument


Название: Re: QNetWorkManager - прием объекта javascript
Отправлено: Larry от Январь 27, 2017, 10:23
Проблема в том, что readAll ничего не возвращает - размер QByteArray = 0.


Название: Re: QNetWorkManager - прием объекта javascript
Отправлено: Alex Custov от Январь 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"

то есть ответ приходит, хоть и ошибочный.


Название: Re: QNetWorkManager - прием объекта javascript
Отправлено: Larry от Январь 27, 2017, 15:23
Там уже не рабочий token, потому и ошибку выдает. Создал новый, но тогда программа ничего не выдает, а через время завершает работу, но данных нет.

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

Попробуйте пожалуйста, может у Вас получится :)
Спасибо.


Название: Re: QNetWorkManager - прием объекта javascript
Отправлено: Alex Custov от Январь 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


Название: Re: QNetWorkManager - прием объекта javascript
Отправлено: Larry от Январь 27, 2017, 17:14
Спасибо большое. Так заработало.