Mit Qt eine *.json Datei einer Url empfangen ?

Qt Programmierung, QML, Qt-Plattformen
Antworten
Pinguinschal
Beiträge: 7
Registriert: Mi Sep 24, 2014 1:38 pm

Mit Qt eine *.json Datei einer Url empfangen ?

Beitrag von Pinguinschal » Mi Sep 24, 2014 1:45 pm

Hallo,
ich möchte gerne in meinem Programm mittels einer QTableView die Inhalte eines *.json dokuments anzeigen, welches ich zuvor von einem Link bekommen habe. Wenn man diesen Link im Internet eingibt, fragt Firefox einen ob man das Dokument speichern möchte. Ich habe im Internet bisher nur von möglichekeiten gelesen, den Quellcode einer Internetseite zu bekommen, oder die Seite grafisch dar zu stellen. Wie muss ich das benutzen?

Das Beispiel der QT Project Seite hat mich wegen den ganzen Slots nur nochmehr verwirrt. Funktionieren tut es bei mir auch nicht.
Das ist der Code aus dem Beispiel :

Code: Alles auswählen

  QNetworkAccessManager *manager = new QNetworkAccessManager(this); <-- Diese beiden Zeilen werden übrigens
    connect(manager, SIGNAL(finished(QNetworkReply*)),                                          . sogar als fehler unterstrichen, obwohl ich es
            this, SLOT(replyFinished(QNetworkReply*)));                                                 . includiert habe. 
                                                                                                                              .  
    manager->get(QNetworkRequest(QUrl("http://qt.nokia.com"))); <-------------------------------
Fehler dazu sagt übrigens : undefined reference to `QNetworkAccessManager::QNetworkAccessManager(QObject*)
Muss ich überhaupt QNetworkAccessManager benutzen? Ich bin mir dabei noch nicht so sicher. Würde mich über Tipps freuen.
Danke

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Mit Qt eine *.json Datei einer Url empfangen ?

Beitrag von Xin » Mi Sep 24, 2014 2:24 pm

Ich bin kein Qt-Spezialist, aber

Code: Alles auswählen

undefined reference to `QNetworkAccessManager::QNetworkAccessManager(QObject*)
ist eine Linker-Fehlermeldung.

Du musst noch eine Qt-Lib hinzulinken, die die entsprechende Funktion beinhaltet.
Wie hast Du das Projekt erstellt und hast Du Änderungen vorgenommen?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Mit Qt eine *.json Datei einer Url empfangen ?

Beitrag von nufan » Mi Sep 24, 2014 3:32 pm

Du musst in deine .pro-Datei

Code: Alles auswählen

QT += network
einfügen, dann sollte es mal bauen.

Bezüglich JSON: Welche Version von Qt verwendest du?

Pinguinschal
Beiträge: 7
Registriert: Mi Sep 24, 2014 1:38 pm

Re: Mit Qt eine *.json Datei einer Url empfangen ?

Beitrag von Pinguinschal » Do Sep 25, 2014 7:18 am

Hallo,
danke für die schnelle Antwort.

Ich benutze cmake, habe also eine build datei, wesshalb ich das mit =+ nicht brauche, aber ich hatte tatsächlich vergessen es in der build datei hinzuzufügen. Nun nimmt er es an.

Aber ist das denn der Richtige Weg, QNetworkAccessManager zu benutzen, für das was ich vor habe und ist der Beispielcode dafür richtig oder muss ich etwas anders machen ?
Denn wenn ich http://google.de eingebe als url, dann gibt es keinen networkerror, aber wenn ich meinen Link eingebe ( der in Firefox funktioniert ) dann gibt es einen Networkerror, weil er vermutlich eine Datei zurück gibt. Was muss ich dafür verändern ?

Pinguinschal
Beiträge: 7
Registriert: Mi Sep 24, 2014 1:38 pm

Re: Mit Qt eine *.json Datei einer Url empfangen ?

Beitrag von Pinguinschal » Do Sep 25, 2014 8:36 am

Oh, nein, bei http://google.de wirft es auch einen network error, es dauert nur länger.
Was ist der Fehler in dem Code ?

Code: Alles auswählen

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(serviceRequestFinished(QNetworkReply*)));
    manager->get(QNetworkRequest(QUrl("http://google.de")));
	}
void Tester::serviceRequestFinished(QNetworkReply* reply)
{
    reply->deleteLater();
    if(reply->error() == QNetworkReply::NoError) {
        QByteArray data = reply->readAll();
        qDebug(data);
        qDebug("keinError");
    } else {
    	 cout<<"Error in Reply"<<endl;
    }
}

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Mit Qt eine *.json Datei einer Url empfangen ?

Beitrag von nufan » Do Sep 25, 2014 10:12 am

Kannst du ein minimales Demo-Projekt zusammenstellen und hochladen?

Pinguinschal
Beiträge: 7
Registriert: Mi Sep 24, 2014 1:38 pm

Re: Mit Qt eine *.json Datei einer Url empfangen ?

Beitrag von Pinguinschal » Do Sep 25, 2014 12:24 pm

Natürlich.
Also zuerst hatte ich probiert aus einer Datenbank daten dar zu stellen, das ist noch im Programm drinne, weil ich die Daten die ich dann aus der .json Datei auslese, in eine Datenbank speichern will.
Ich hatte den Fehler gefunden, bei google.de hatte ich www. vorher vergessen. Wenn ich es mit Google nun Probiere, funktionert es. Naja, es wirft zumin. keinen Fehler. Jedoch hat die URL die ich benutzen muss, kein www. . Es ist von der AIS Seite und gibt mir Die AIS Daten zurück. In meinem Beispiel wird desshalb mein Benutzername durch ein Beispiel ersetzt. Der Fehler den es Ausgiebt, lautet:
Protocol "" is unknown

Code: Alles auswählen

void Tester::init()
{	QSqlQueryModel *model = new QSqlQueryModel (this);
	view = new QTableView(this);
	/*
          Code für die Verbindung von Qt und Mysql
       */

    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(serviceRequestFinished(QNetworkReply*)));
    manager->get(QNetworkRequest(QUrl("data.aishub.net/ws.php?username=AH_BSPC&format=1&output=json&compress=0&latmin=50&latmax=58&lonmin=5&lonmax=10")));

	}
void Tester::serviceRequestFinished(QNetworkReply* reply)
{
    reply->deleteLater();
    if(reply->error() == QNetworkReply::NoError) {
        QByteArray data = reply->readAll();
        QString Sdata = data.data();
        qDebug(data);
        qDebug("keinError");

    } else {
    	 cout<<"Error in Reply"<<endl;
    	 QByteArray data = reply->readAll();
    	 QString errors;
    	 errors = (reply->errorString());
    	 string utf8_text = errors.toUtf8().constData();
    	 cout<<utf8_text<<endl;
    }
}

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Mit Qt eine *.json Datei einer Url empfangen ?

Beitrag von nufan » Do Sep 25, 2014 12:43 pm

Mit Demo-Projekt meinte ich etwas das man kompilieren und ausführen kann.
Pinguinschal hat geschrieben:Protocol "" is unknown
Versuch mal in der URL "http://" bzw. "https://" davor zu schreiben.

Pinguinschal
Beiträge: 7
Registriert: Mi Sep 24, 2014 1:38 pm

Re: Mit Qt eine *.json Datei einer Url empfangen ?

Beitrag von Pinguinschal » Do Sep 25, 2014 1:07 pm

Mit http:// / https:// kommt wieder " host not found. Könnte daran liegen das ich hier n Proxy & n DNS habe. Wenn ich es mit einem der Beiden bei Firefox eingebe, kommt der Fehler : " Network Error (dns_unresolved_hostname)
Your requested host "www.data.aishub.net" could not be resolved by DNS. "
Tester.h

Code: Alles auswählen

#include <QtGui/QTableWidget>
#include <QtSql/QSqlQueryModel>
#include <QtNetwork/QNetworkReply>

#ifndef TESTER_H_
#define TESTER_H_


class Tester : public QTableView
{
    Q_OBJECT

public:
    Tester();
    virtual ~Tester();
    void init();
    bool returnvalue;
    QTableWidget table;
    QTableView *view;
 public slots:
    void serviceRequestFinished(QNetworkReply* reply);
};
#endif /* TESTER_H_ */
Tester.cpp main

Code: Alles auswählen

using namespace std;
int main(int argc, char **argv)
{
	 QApplication app (argc, argv);
	 Tester tester;
	 tester.init();
	 tester.show();
	 return app.exec();
}
Tester init

Code: Alles auswählen

void Tester::init()
{	
     view = new QTableView(this);
     this->setGeometry(500,500,400,350);
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(serviceRequestFinished(QNetworkReply*)));
// Nur Beispiel username
    manager->get(QNetworkRequest(QUrl("data.aishub.net/ws.php?username=BSP&format=1&output=json&   compress=0&latmin=50&latmax=58&lonmin=5&lonmax=10")));

	}
void Tester::serviceRequestFinished(QNetworkReply* reply)
{
    reply->deleteLater();
    if(reply->error() == QNetworkReply::NoError) {
        QByteArray data = reply->readAll();
        QString Sdata = data.data();
        qDebug(data);
        qDebug("keinError");
    } else {
    	 cout<<"Error in Reply"<<endl;
    	 QByteArray data = reply->readAll();
    	 QString errors;
    	 errors = (reply->errorString());
    	 string utf8_text = errors.toUtf8().constData();
    	 cout<<utf8_text<<endl;
    }
}

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Mit Qt eine *.json Datei einer Url empfangen ?

Beitrag von nufan » Do Sep 25, 2014 1:33 pm

Naja kompilierbar ist das so leider nicht, auch die qmake-Datei fehlt.
Pinguinschal hat geschrieben:Mit http:// / https:// kommt wieder " host not found. Könnte daran liegen das ich hier n Proxy & n DNS habe. Wenn ich es mit einem der Beiden bei Firefox eingebe, kommt der Fehler : " Network Error (dns_unresolved_hostname)
Bei mir funktioniert das mit http://. Ich bekomme zwar eine Fehlermeldung innerhalb der JSON-Datei (wegen ungültiger Zugangsdaten) aber prinzipiell erreiche ich die Datei.

Antworten