Как я могу скачать данные по любой ссылке?

0

Я хочу получить строку, которая появляется по следующей ссылке в моей программе Qt, как я могу ее получить?

http://en.wikipedia.org/w/api.php?action=opensearch&search=centaurus_constellation

Я закодировал следующие файлы, чтобы получить строку, показанную на вышеприведенной странице, в m_DownloadedData, но она хранит пустую строку в конце программы, может ли кто-нибудь помочь мне получить данные из вышеуказанной ссылки?

.h файл:

#ifndef SKYOBJDESCRIPTION_H
#define SKYOBJDESCRIPTION_H

#include <QObject>
#include <QByteArray>
#include <QString>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>

class SkyObjDescription : public QObject
{
    Q_OBJECT
public:
    explicit SkyObjDescription(const QString soName, const QString soType, QObject* parent = 0);

    virtual ~SkyObjDescription();

    QByteArray downloadedData() const;

signals:
        void downloaded();

private slots:

    void fileDownloaded(QNetworkReply* reply);

private:
    QString soName,soType;
    QByteArray m_DownloadedData;

};

#endif // SKYOBJDESCRIPTION_H

и.cpp файл

    #include <QString>
    #include <QUrl>
    #include <QDebug>

    #include "skyobjdescription.h"


    SkyObjDescription::SkyObjDescription(const QString so_Name, const QString so_Type, QObject* parent): soName(so_Name), soType(so_Type), QObject(parent)
    {
        QString wikiLink = "http://en.wikipedia.org/w/api.php?action=opensearch&search="+ soName.replace(" ", "_").toLower() + "_" + soType.toLower() + "&format=xml&limit=1.xml";

 //       QUrl wikiUrl("http://en.wikipedia.org/w/api.php?action=opensearch&search=hello_world&format=xml&limit=1.xml");
        m_DownloadedData = wikiUrl.toEncoded();
        qDebug() << "wikiUrl.toEncoded(): " << m_DownloadedData; 
        QNetworkRequest req(wikiUrl);

        QNetworkAccessManager* manager = new QNetworkAccessManager(this);
        connect(manager, SIGNAL(finished(QNetworkReply*)), SLOT(fileDownloaded(QNetworkReply*)));
        manager->get(req);

    }

    SkyObjDescription::~SkyObjDescription()
    {

    }

    void SkyObjDescription::fileDownloaded(QNetworkReply* reply)
    {
        m_DownloadedData = reply->readAll();
        qDebug() << "received reply";
        qDebug() << m_DownloadedData;
        reply->deleteLater();
        emit downloaded();
    }

    QByteArray SkyObjDescription::downloadedData() const
    {
        qDebug() << m_DownloadedData;
        return m_DownloadedData;
    }

часть main.cpp

SkyObjDescription * skd = new SkyObjDescription(m_Name, "Constellation");
        QString data(skd->downloadedData());
        qDebug() << data;
        delete skd;

Если есть другой способ получить данные из ссылки, пожалуйста, объясните это. Большое спасибо :)

Теги:
qt

1 ответ

3

Вероятно, эксперимент вызван двойным вызовом QNetworkReply::readAll.

Помнит, что это операция ввода-вывода, и нет возможности многократно считывать информацию, содержащуюся в ответе netwrk.

Просто прокомментируйте свою строку отладки:

void SkyObjDescription::fileDownloaded(QNetworkReply* pReply)
{
    //qDebug() << pReply->readAll();
    m_DownloadedData = pReply->readAll();
    //emit a signal
    pReply->deleteLater();
    emit downloaded();
}

редактировать (для полноты)

Код проверки, который я использую:

#ifndef TMP_H
#define TMP_H

#include <QObject>

class QNetworkReply;

class Tmp : public QObject
{
    Q_OBJECT
public:
    explicit Tmp(QObject *parent = 0);

signals:

public slots:
    void displayResult(QNetworkReply* reply);

};

#endif // TMP_H

//tmp.cpp
#include "tmp.h"
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QDebug>

Tmp::Tmp(QObject *parent) :
    QObject(parent)
{
    QUrl url("http://en.wikipedia.org/wiki/Centaurus_constellation");
    QNetworkRequest req(url);

    QNetworkAccessManager* manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)), SLOT(displayResult(QNetworkReply*)));
    manager->get(req);
}

void Tmp::displayResult(QNetworkReply *reply) {
    QByteArray buffer = reply->readAll();
    qDebug() << "received reply";
    qDebug() << buffer;
    reply->deleteLater();
}
  • 0
    Все еще не работает
  • 0
    @ Vijay13: покажи мое редактирование с примером и проверь на своей стороне этот небольшой объем кода. Ваша проблема, вероятно, должна полагаться где-то еще в вашем коде
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню