LINUX.ORG.RU

Qt POST to QString

 ,


0

1

Необходимо сделать post запрос с параметрами определёнными и куками и получить из неё строку и дальше с ней веселиться , короче приходить JSON строка, но API сети оно же ассинхронно и я просто не могу выполнить функцию и из неё выплюнуть строку или могу?

Вопрос нубский но всё же :)

★★★

Последнее исправление: chapay (всего исправлений: 1)

Кьютовские теги расставь, чтобы в тред кастануло тех, кто разбирается в Qt.

В чем проблема генерировать сигнал, на который будет реагировать слот?

EXL ★★★★★
()
Ответ на: комментарий от EXL

А из слота как я выковорю строку?

chapay ★★★
() автор топика

Посмотри http://qt-project.org/doc/qt-4.8/network-download-main-cpp.html этот пример. Там отправляется ПОСТ и по сигналу завершения получишь полный ответ от сервера. А потом делай что хочешь. PS connect(&manager, SIGNAL(finished(QNetworkReply*)),SLOT(downloadFinished(QNetworkReply*))); реализуй по своему downloadFinished()

CrazyAlex25 ★★★
()

слать POST нужно с помощью QNetworkAccessManager. Результат считать из возвращённого QNetworkReply. Сделать синхронный запрос (не приветствуется в GUI приложении) можно с помощью локальной очереди QEventLoop, иначе он будет по-умолчанию асинхронным.

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

ок делаем код

QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finish_get(QNetworkReply*)));

И вот сама функция

void connecter::finish_get(QNetworkReply *reply)
{
    QByteArray bytes = reply->readAll();
    qDebug() << QString::fromUtf8(bytes.data(), bytes.size());
}

Но такое ощущение что срабатывает данная функция 2 раза причём один раз с 200 кодом второй раз с 303 кодом и если я делаю

$this->answer = reply->readAll();
То переменная answer пуста :(

chapay ★★★
() автор топика
Ответ на: комментарий от chapay

Я делаю так, и у меня работает

class Downloader : public QObject {
    Q_OBJECT
    public:
        Downloader(QObject * = 0);
        void download(QString);

    signals:
        void downloaded(QByteArray);
        void error(QString);

    private slots:
        void dataReady(QNetworkReply*);

    private:
        QNetworkAccessManager   network_manager;
};

Downloader::Downloader(QObject *parent)
    : QObject(parent) {
    connect(&network_manager,
            &QNetworkAccessManager::finished,
            this,
            &Downloader::dataReady);
}

void Downloader::download(QString u) {
    QNetworkRequest     request(QUrl(u));
    network_manager.get(request);
}

void Downloader::dataReady(QNetworkReply *reply) {
    if(reply -> error() != QNetworkReply::NoError) {
        emit error("...");
        return;
    }
    QByteArray  array = reply -> readAll();
    emit arrayDownloaded(array);
    reply -> deleteLater();
}

energyclab
()
Ответ на: комментарий от chapay

Если у тебя qt5, то там уже есть класс для работы с json (QJsonDocument)

QMap<QString, QVariant>     map;
QJsonDocument               doc;
doc = QJsonDocument::fromJson(data.toLocal8Bit().data());
map = doc.toVariant().toMap();
emit dataReceived(map);

На qt4 я использовал jansson для перегона json документа в QMap<QString, QVariant>

energyclab
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.