Mit Qhttp eine Webseite auslesen

Alles rund um die Programmierung mit Qt
Antworten
fmprog
Beiträge: 11
Registriert: 28. März 2011 10:34

Mit Qhttp eine Webseite auslesen

Beitrag von fmprog »

Hallo,

ich möchte mit meinem Programm eine Webseite aufrufen, der ich URL-Parameter mitgebe. Anhand der Parameter wird dann die Webseite generiert, die ich auslesen möchte. Leider bekomme ich es nicht 100 % zum laufen.

Die wichtigen Stellen im Code sind:

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtNetwork>
#include <QHttp>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    QHttp* http;

private slots:
    void onFinishDone(int id, bool error);
};
Im Grunde enthält die Klasse nur meine QHttp Variable.

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
#include <QHttp>
#include <QByteArray>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    http = new QHttp();

    connect(http,SIGNAL(requestFinished(int, bool)), this, SLOT(onFinishDone(int, bool)));
}

void MainWindow::timerEvent(QTimerEvent *e)
{
       ...
       QHttpRequestHeader header2("GET");
       http->setHost("212.204.97.173");
       http->get("/tgi/control.tgi?p=list");
       http->request(header2);
  
}

void MainWindow::onFinishDone(int id, bool error)
{
    QByteArray bytes = http->readAll();
    QString test(bytes);

    ui->connect1Label->setText(test);
}
Leider bekomme ich durch "readAll" nur einen leeren String zurück. Die Webseite sollte aber eigentlich <html>0101</html> zurück liefern. Die Zahlen innerhalb des html tags können unterschiedlich sein.

Wenn ich aber diesen Code ausführe, rein zum Testen:

Code: Alles auswählen

       QHttpRequestHeader header2("GET", "");
       http->setHost("www.FunundFreizeit.de");
       http->get("/index.php");
       http->request(header2);
Kann ich diese Webseite wunderbar auslesen.

Vielleicht kann mir jemand von euch helfen? Und ja, ich habe sowohl die Doku gelesen als auch die SuFu verwendet.

Gruß
f
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Werte doch mal den HTTP (Error-)Code aus. Wenn 200 zurückkommt, sollte da wohl tatsächlich <html>0101</html> drin stehn. Kommt 302, 404 o.ä. zurück, dann ist readAll() leer.

Ausserdem ist QHttp deprecated, du solltest den QNetworkAccessManager verwenden.
fmprog
Beiträge: 11
Registriert: 28. März 2011 10:34

Beitrag von fmprog »

Danke für deine Antwort. Ich habe jetzt, wie du gesagt hast, die QNetworkAccessManager Klasse verwendet.

Allerdings kommt bei meiner gewünschten Webseite wieder ein leerer String. Ich habe jetzt mehrere Seiten ausprobiert, da funktioniert es, nur bei dieser einen nicht.

Code: Alles auswählen

connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));

Code: Alles auswählen

       QNetworkRequest request;
       request.setUrl(QUrl("http://212.204.97.173/tgi/control.tgi?p=l"));
       QNetworkReply *reply = manager->get(request);

Code: Alles auswählen

void MainWindow::replyFinished(QNetworkReply* reply)
{
  QString set = reply->readAll();
  set = set;
}
Ich bin mir nicht wirklich sicher, woran das liegen könnte. Wenn ich die Adresse, so wie sie da ist, ist meinem Browser eingebe, bekomme ich eine gültige Webseite zu sehen.

Gruß
f
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

4 Punkte:

1) Wie ist der HTTP Statuscode für die Anfrage? (200 = OK, 301 = Redirect, 404 = not found etc)

Code: Alles auswählen

qDebug() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
2) Gib doch mal folgendes aus:

Code: Alles auswählen

qDebug() << reply->rawHeaderPairs();
3) Fehlt im Code ein reply->deleteLater(), sonst ists ein Memory Leak.

4) Wenn du später mal mehr als ein paar Bytes runterladen willst, kann es sein dass nicht alles am Stück übertragen wird. In diesem fall solltest du dich auf das Signal readyRead() der Reply connecten, und die Daten stückchenweise lesen, bis das finished-Signal kommt (oder alles gelesen wurde, was das gleiche ist im Normalfall).
fmprog
Beiträge: 11
Registriert: 28. März 2011 10:34

Beitrag von fmprog »

pfid hat geschrieben: 1) Wie ist der HTTP Statuscode für die Anfrage? (200 = OK, 301 = Redirect, 404 = not found etc)
Hier bekomme ich als Ausgabe einfach eine "0".

pfid hat geschrieben: 2) Gib doch mal folgendes aus:

Code: Alles auswählen

qDebug() << reply->rawHeaderPairs();
Hier bekomme ich als Ausgabe nur "()".
pfid hat geschrieben: 3) Fehlt im Code ein reply->deleteLater(), sonst ists ein Memory Leak.
Habe ich nun drin. Ich bin mir nur unsicher an welcher Stelle es am besten ist, da ich mal gelesen habe, es ist in der Funktion die durch das "finished" Signal aufgerufen wird, falsch.
pfid hat geschrieben: 4) Wenn du später mal mehr als ein paar Bytes runterladen willst, kann es sein dass nicht alles am Stück übertragen wird. In diesem fall solltest du dich auf das Signal readyRead() der Reply connecten, und die Daten stückchenweise lesen, bis das finished-Signal kommt (oder alles gelesen wurde, was das gleiche ist im Normalfall).
Danke für den Hinweis. Momentan reichen mir aber "die paar Bytes".

Gruß
f
Antworten